pghero 4.0.0 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d94ff090a5f14bb71bfa373b96d1e384968e2981fdb2bd897aceeaea9d7256fe
4
- data.tar.gz: d2b03444934fe241cfd75506e850818acedbe4dc64083cfd1d29a7c1f1264c80
3
+ metadata.gz: 9a4cfe44cedeb0150487120c8cb8ffa17b319fe1950a0140cfab35b64e00a52b
4
+ data.tar.gz: ae1b6e6380230a166ccce42f9da6143364bf4ab58f041de2944e1a80dfc2f403
5
5
  SHA512:
6
- metadata.gz: b97f3b6f3ff66d8c5a628a23590940377dd6dcce53993997394ede41c49df7fa49a422aff8722d06d65b8e36203f5dfb3a81a6e415360e32cddc0cccf14db6b3
7
- data.tar.gz: d8c42ca3cc1fd0e2b59d08af48992aa88e335f6ab95d03188fc59454d1f495bac3883a995c3cb0d5681e2a7c3a0698ab199ff6089a05a4d0e8038d1ca3a58fef
6
+ metadata.gz: d951a347d8018e5a04aafc24bf724774c6882e88e6b084756eda02d30b49c9cdea013b223c17c401dbe5d342f42b18687c1d332ac982e766efae5296ca4de359
7
+ data.tar.gz: 2d20b1f83a9d7d13e38f632f8f30d8c69c83a1e4d82351d51e3b8351dc0fc53bcad10202c9a7c88532457deeec8fa30bfef7dfc8b9c95f6d6311e87350593f98
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
+ ## 4.0.1 (2026-08-15)
2
+
3
+ - Added sequences from identity columns
4
+
1
5
  ## 4.0.0 (2026-08-05)
2
6
 
7
+ See the upgrade notes for [Docker](guides/Docker.md#upgrading) or [Rails](guides/Rails.md#upgrading)
8
+
3
9
  - Reduced space for historical query stats
4
10
  - Added `disable_kill` option to disable killing queries and connections
5
11
  - Added `unused_index_megabytes` option to set minimum size for unused indexes
@@ -2,13 +2,16 @@ module PgHero
2
2
  module Methods
3
3
  module Sequences
4
4
  def sequences
5
- # get columns with default values
6
- # use pg_get_expr to get correct default value
5
+ # get columns with default values and identity columns
6
+ # use pg_depend to get owned sequences (like pg_get_serial_sequence)
7
+ # use pg_get_expr to get correct default value for rest
7
8
  # it's what information_schema.columns uses
8
9
  # also, exclude temporary tables to prevent error
9
10
  # when accessing across sessions
10
11
  sequences = select_all <<~SQL
11
12
  SELECT
13
+ sn.nspname AS schema,
14
+ s.relname AS sequence,
12
15
  n.nspname AS table_schema,
13
16
  c.relname AS table,
14
17
  attname AS column,
@@ -20,32 +23,51 @@ module PgHero
20
23
  pg_catalog.pg_class c ON c.oid = a.attrelid
21
24
  INNER JOIN
22
25
  pg_catalog.pg_namespace n ON n.oid = c.relnamespace
23
- INNER JOIN
24
- pg_catalog.pg_attrdef d ON (a.attrelid, a.attnum) = (d.adrelid, d.adnum)
26
+ LEFT JOIN
27
+ pg_catalog.pg_depend dep ON dep.refclassid = 'pg_catalog.pg_class'::regclass
28
+ AND dep.refobjid = a.attrelid
29
+ AND dep.refobjsubid = a.attnum
30
+ AND dep.classid = 'pg_catalog.pg_class'::regclass
31
+ AND dep.objsubid = 0
32
+ AND dep.deptype IN ('i', 'a')
33
+ AND dep.objid IN (SELECT oid FROM pg_class WHERE relkind = 'S')
34
+ LEFT JOIN
35
+ pg_catalog.pg_class s ON s.oid = dep.objid
36
+ LEFT JOIN
37
+ pg_catalog.pg_namespace sn ON sn.oid = s.relnamespace
38
+ LEFT JOIN
39
+ pg_catalog.pg_attrdef d ON a.attrelid = d.adrelid
40
+ AND a.attnum = d.adnum
41
+ AND s.relkind IS NULL
25
42
  WHERE
26
43
  NOT a.attisdropped
27
44
  AND a.attnum > 0
28
- AND pg_get_expr(d.adbin, d.adrelid) LIKE 'nextval%'
29
- AND n.nspname NOT LIKE 'pg\\_temp\\_%'
45
+ AND (pg_get_expr(d.adbin, d.adrelid) LIKE 'nextval%' OR s.relname IS NOT NULL)
46
+ AND c.relpersistence <> 't'
30
47
  SQL
31
48
 
32
- # parse out sequence
33
49
  sequences.each do |column|
34
- column[:max_value] = column[:column_type] == 'integer' ? 2147483647 : 9223372036854775807
50
+ column[:max_value] =
51
+ case column[:column_type]
52
+ when "smallint"
53
+ 32767
54
+ when "integer"
55
+ 2147483647
56
+ else
57
+ 9223372036854775807
58
+ end
35
59
 
36
- column[:schema], column[:sequence] = parse_default_value(column[:default_value])
60
+ unless column[:sequence]
61
+ column[:schema], column[:sequence] = parse_default_value(column[:default_value])
62
+ end
37
63
  column.delete(:default_value) if column[:sequence]
38
64
  end
39
65
 
40
66
  add_sequence_attributes(sequences)
41
67
 
42
68
  last_value = {}
43
- sequences.select { |s| s[:readable] }.map { |s| [s[:schema], s[:sequence]] }.uniq.each_slice(1024) do |slice|
44
- sql = slice.map { |s| "SELECT last_value FROM #{quote_ident(s[0])}.#{quote_ident(s[1])}" }.join(" UNION ALL ")
45
-
46
- select_all(sql).zip(slice) do |row, seq|
47
- last_value[seq] = row[:last_value]
48
- end
69
+ select_all("SELECT schemaname AS schema, sequencename AS sequence, COALESCE(last_value, start_value) AS last_value FROM pg_sequences").each do |row|
70
+ last_value[[row[:schema], row[:sequence]]] = row[:last_value]
49
71
  end
50
72
 
51
73
  sequences.select { |s| s[:readable] }.each do |seq|
@@ -67,8 +89,8 @@ module PgHero
67
89
  # nextval('id_seq'::regclass)
68
90
  # nextval(('id_seq'::text)::regclass)
69
91
  def parse_default_value(default_value)
70
- m = /^nextval\('(.+)'\:\:regclass\)$/.match(default_value)
71
- m = /^nextval\(\('(.+)'\:\:text\)\:\:regclass\)$/.match(default_value) unless m
92
+ m = /\Anextval\('(.+)'\:\:regclass\)\z/.match(default_value)
93
+ m = /\Anextval\(\('(.+)'\:\:text\)\:\:regclass\)\z/.match(default_value) unless m
72
94
  if m
73
95
  unquote_ident(m[1])
74
96
  else
@@ -1,3 +1,3 @@
1
1
  module PgHero
2
- VERSION = "4.0.0"
2
+ VERSION = "4.0.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pghero
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane