44 "context"
55 "fmt"
66 "os"
7+ "strings"
78 "testing"
89
910 "github.com/jackc/pgx/v4"
@@ -13,6 +14,7 @@ import (
1314 "github.com/transferia/transferia/pkg/dblog"
1415 "github.com/transferia/transferia/pkg/dblog/tablequery"
1516 "github.com/transferia/transferia/pkg/providers/postgres"
17+ pg_dblog "github.com/transferia/transferia/pkg/providers/postgres/dblog"
1618 "github.com/transferia/transferia/pkg/providers/postgres/pgrecipe"
1719 "github.com/transferia/transferia/tests/helpers"
1820)
@@ -39,12 +41,14 @@ var (
3941 "bigint" ,
4042 "bigserial" ,
4143 "oid" ,
44+ "tid" ,
4245
4346 "real" ,
4447 "double precision" ,
4548
4649 "char" ,
4750 "varchar" ,
51+ "name" ,
4852
4953 "character" ,
5054 "character varying" ,
8690 "cidr" ,
8791 "macaddr" ,
8892 "citext" ,
93+
94+ "_jsonb" ,
95+ "_numeric" ,
96+ "_text" ,
97+ "_timestamp" ,
98+ "_timestamptz" ,
99+ // "_tsrange", failed to execute SELECT: ERROR: malformed range literal: "[2023-01-01 00:00:00" (SQLSTATE 22P02)
100+ // "_tstzrange", failed to execute SELECT: ERROR: malformed range literal: "[2023-01-01 00:00:00Z" (SQLSTATE 22P02)
101+ "_uuid" ,
102+ "_varchar" ,
103+ // "_aclitem", could not identify a comparison function for type aclitem
104+ "_bool" ,
105+ "_bpchar" ,
106+ "_bytea" ,
107+ "_cidr" ,
108+ "_date" ,
109+ "_float4" ,
110+ "_float8" ,
111+ "_inet" ,
112+ "_int2" ,
113+ "_int4" ,
114+ "_int8" ,
115+ "bpchar" ,
116+ "float4" ,
117+ "float8" ,
118+ "int2" ,
119+ "int4" ,
120+ "int8" ,
121+ "bool" ,
122+
123+ // pg 14+
124+ "nummultirange" ,
125+ "int4multirange" ,
126+ "int8multirange" ,
89127 }
90128)
91129
@@ -110,7 +148,14 @@ func TestIncrementalSnapshot(t *testing.T) {
110148 tx , err := conn .BeginTx (context .TODO (), repeatableReadWriteTxOptions )
111149 require .NoError (t , err )
112150
151+ tableNames := make ([]string , 0 , len (postgresTypes ))
152+
113153 for _ , pgType := range postgresTypes {
154+ require .Equal (t , dblog .TypeSupported , pg_dblog .CheckTypeCompatibility (pgType ), "pgType: %s" , pgType )
155+
156+ tableName := createTableNameForType (pgType )
157+ tableNames = append (tableNames , tableName )
158+
114159 _ , err := tx .Exec (context .TODO (), createTableWithPkTypeQuery (pgType ))
115160 require .NoError (t , err )
116161 }
@@ -133,6 +178,7 @@ func TestIncrementalSnapshot(t *testing.T) {
133178
134179 "char_pk_table" : {"'A'" , "'B'" },
135180 "varchar_pk_table" : {"'alpha'" , "'beta'" },
181+ "name_pk_table" : {"'A'" , "'B'" },
136182
137183 "character_pk_table" : {"'A'" , "'B'" },
138184 "character varying_pk_table" : {"'alpha'" , "'beta'" },
@@ -168,10 +214,56 @@ func TestIncrementalSnapshot(t *testing.T) {
168214 "cidr_pk_table" : {"'192.168.1.0/24'" , "'192.168.2.0/24'" },
169215 "macaddr_pk_table" : {"'08:00:2b:01:02:03'" , "'08:00:2b:01:02:04'" },
170216 "citext_pk_table" : {"'example'" , "'test'" },
217+
218+ "tid_pk_table" : {"'(0,1)'" , "'(0,2)'" },
219+ "bpchar_pk_table" : {"'A'" , "'B'" },
220+ "float4_pk_table" : {"'1.1'" , "'2.2'" },
221+ "float8_pk_table" : {"'1.1'" , "'2.2'" },
222+ "int2_pk_table" : {"'1'" , "'2'" },
223+ "int4_pk_table" : {"'1'" , "'2'" },
224+ "int8_pk_table" : {"'100'" , "'200'" },
225+ "bool_pk_table" : {"'false'" , "'true'" },
226+
227+ // pg 14+
228+ "nummultirange_pk_table" : {"'{(15e-1,25e-1), (25e-1,35e-1)}'" , "'{(20e-1,30e-1), (30e-1,40e-1)}'" },
229+ "int4multirange_pk_table" : {"'{[3,7), [8,9)}'" , "'{[4,8), [9,10)}'" },
230+ "int8multirange_pk_table" : {"'{[1,100), [200,300)}'" , "'{[100,200), [300,400)}'" },
231+
232+ "_jsonb_pk_table" : {"'{1, 2, 3}'" , "'{4, 5, 6}'" },
233+ "_numeric_pk_table" : {"ARRAY['1.1', '2.2']::numeric[]" , "ARRAY['3.3', '4.4']::numeric[]" },
234+ "_text_pk_table" : {"ARRAY['alpha', 'beta']::text[]" , "ARRAY['gamma', 'delta']::text[]" },
235+ "_timestamp_pk_table" : {"ARRAY['2023-01-01 00:00:00', '2023-01-02 00:00:00']::timestamp[]" , "ARRAY['2023-01-03 00:00:00']::timestamp[]" },
236+ "_timestamptz_pk_table" : {"'{2023-01-01 00:00:00+03, 2023-01-02 00:00:00+03}'" , "'{2023-01-03 00:00:00+03, 2023-01-04 00:00:00+03}'" },
237+ // failed to execute SELECT: ERROR: malformed range literal: "[2023-01-01 00:00:00" (SQLSTATE 22P02)
238+ // "_tsrange_pk_table": {"'{\"[2023-01-01 00:00:00,2023-01-01 01:00:00)\"}'::tsrange[]", "'{\"[2023-01-02 00:00:00,2023-01-02 01:00:00)\"}'::tsrange[]"}
239+ // "_tstzrange_pk_table": {"'{\"[2023-01-01 00:00:00Z,2023-01-01 01:00:00Z)\"}'", "'{\"[2023-01-02 00:00:00Z,2023-01-02 01:00:00Z)\"}'"},
240+ "_uuid_pk_table" : {"'{550e8400-e29b-41d4-a716-446655440000, 550e8400-e29b-41d4-a716-446655440001}'" , "'{550e8400-e29b-41d4-a716-446655440002, 550e8400-e29b-41d4-a716-446655440003}'" },
241+ "_varchar_pk_table" : {"'{alpha, beta}'" , "'{gamma, delta}'" },
242+ "_bool_pk_table" : {"'{false, true}'" , "'{true, true}'" },
243+ "_bpchar_pk_table" : {"'{A, B}'" , "'{C, D}'" },
244+ "_bytea_pk_table" : {"'{\\ x00, \\ xff}'" , "'{\\ xaa}'" },
245+ "_cidr_pk_table" : {"'{192.168.1.0/24, 192.168.2.0/24}'" , "'{192.168.3.0/24}'" },
246+ "_date_pk_table" : {"'{2023-01-01, 2023-01-02}'" , "'{2023-01-03}'" },
247+ "_float4_pk_table" : {"'{1.1, 2.2}'" , "'{3.3, 4.4}'" },
248+ "_float8_pk_table" : {"'{1.1, 2.2}'" , "'{3.3, 4.4}'" },
249+ "_inet_pk_table" : {"'{192.168.1.1, 192.168.1.2}'" , "'{192.168.1.3}'" },
250+ "_int2_pk_table" : {"'{1, 2}'" , "'{3, 4}'" },
251+ "_int4_pk_table" : {"'{1, 2}'" , "'{3, 4}'" },
252+ "_int8_pk_table" : {"'{100, 200}'" , "'{300, 400}'" },
253+ }
254+
255+ keys := make ([]string , 0 , len (inserts ))
256+ tableNamesInInserts := make ([]string , 0 , len (inserts ))
257+ for key := range inserts {
258+ keys = append (keys , strings .TrimSuffix (key , "_pk_table" ))
259+ tableNamesInInserts = append (tableNamesInInserts , key )
171260 }
172261
173- for tableName , insert := range inserts {
174- _ , err := tx .Exec (context .TODO (), insertQueryValues (tableName , addIdxToPk (insert )))
262+ require .ElementsMatch (t , postgresTypes , keys )
263+ require .ElementsMatch (t , tableNamesInInserts , tableNames )
264+
265+ for _ , tableName := range tableNames {
266+ _ , err := tx .Exec (context .TODO (), insertQueryValues (tableName , addIdxToPk (inserts [tableName ])))
175267 require .NoError (t , err )
176268 }
177269
0 commit comments