flydata 0.7.13 → 0.7.14
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 +4 -4
- data/VERSION +1 -1
- data/flydata-core/lib/flydata-core/compatibility_check/db_compatibility_checker.rb +6 -0
- data/flydata-core/lib/flydata-core/errors.rb +30 -0
- data/flydata-core/lib/flydata-core/logger.rb +13 -1
- data/flydata-core/lib/flydata-core/mysql/compatibility_checker.rb +16 -11
- data/flydata-core/lib/flydata-core/mysql/ssl.rb +1 -1
- data/flydata-core/lib/flydata-core/postgresql/compatibility_checker.rb +29 -13
- data/flydata-core/lib/flydata-core/table_def/mysql_table_def.rb +1 -0
- data/flydata-core/lib/flydata-core/table_def/redshift_table_def.rb +1 -0
- data/flydata-core/spec/mysql/compatibility_checker_spec.rb +16 -9
- data/flydata-core/spec/postgresql/compatibility_checker_spec.rb +51 -19
- data/flydata-core/spec/table_def/mysql_table_def_spec.rb +2 -0
- data/flydata-core/spec/table_def/mysql_to_redshift_table_def_spec.rb +21 -17
- data/flydata-core/spec/table_def/mysqldump_test_table_all.dump +1 -0
- data/flydata-core/spec/table_def/redshift_table_def_spec.rb +15 -0
- data/flydata.gemspec +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80a23a5417e480bb9b0b1847be172e3e75354d23
|
4
|
+
data.tar.gz: 6b29963fd37ac981f5a6ebda6485b82a6c1c6f39
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 33e95be5a5ba2cb787f0d99655a1d83af447be3d3ee6122b24156c55de272e8c9eb73be1624e7ad26f45d6874234112d45149b63b42cab41c941a97c5bea5d95
|
7
|
+
data.tar.gz: 802b8a85a0c3ddc9009daa119b2842642a50a94718355b1787760d25e4970d53b5495bed832c9a82a0ca97bd5b569e3d179902fafd105d5f727a284a03dcf79e
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.7.
|
1
|
+
0.7.14
|
@@ -33,6 +33,10 @@ module FlydataCore
|
|
33
33
|
tables.collect{|tn| "'#{tn}'"}.join(',')
|
34
34
|
end
|
35
35
|
|
36
|
+
def database_in_query(database)
|
37
|
+
"'#{database}'"
|
38
|
+
end
|
39
|
+
|
36
40
|
def word_for_table_schema
|
37
41
|
"schema"
|
38
42
|
end
|
@@ -55,6 +59,7 @@ module FlydataCore
|
|
55
59
|
# COMPATIBILITY_ERROR_CLASS = MysqlCompatibilityError
|
56
60
|
|
57
61
|
def create_query(option = @option)
|
62
|
+
return nil if option[:tables].empty?
|
58
63
|
self.class::TABLE_EXISTENCE_CHECK_QUERY_TMPLT % schema_and_table_in_query(option)
|
59
64
|
end
|
60
65
|
|
@@ -83,6 +88,7 @@ module FlydataCore
|
|
83
88
|
|
84
89
|
def check_result(result, option = @option)
|
85
90
|
table_schema, missing_pk_tables = get_schema_and_tables(result)
|
91
|
+
|
86
92
|
unless missing_pk_tables.empty?
|
87
93
|
raise self.class::COMPATIBILITY_ERROR_CLASS,
|
88
94
|
"Primary key is required for tables to sync. " +
|
@@ -34,9 +34,39 @@ module ErrorCode
|
|
34
34
|
BREAKING_ALTER_TABLE_ERROR = 10010
|
35
35
|
BREAKING_INFORMATION_SCHEMA_ERROR = 10011
|
36
36
|
BREAKING_TABLE_DDL_ERROR = 10012
|
37
|
+
UNSUPPORTED_COLUMN_TYPE_ERROR = 10013
|
38
|
+
NO_PRIMARY_KEY_ERROR = 10014
|
37
39
|
INTERNAL_ERROR = 1200
|
38
40
|
end
|
39
41
|
|
42
|
+
module ErrorCode
|
43
|
+
# Convert an error reason to an error hash
|
44
|
+
# ex. {"err_code" => 10003, "Table does not exist"}
|
45
|
+
#
|
46
|
+
# Use this to convert an error message from an old agent to the new error hash
|
47
|
+
def self.err_reason_to_error(err_reason)
|
48
|
+
{"err_code" => lookup_err_code(err_reason), "err_reason" => err_reason}
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.lookup_err_code(err_reason)
|
52
|
+
case err_reason
|
53
|
+
when /^no primary key defined/i
|
54
|
+
FlydataCore::ErrorCode::NO_PRIMARY_KEY_ERROR
|
55
|
+
when /^table does not exist in the MySQL database/i
|
56
|
+
FlydataCore::ErrorCode::TABLE_MISSING_ERROR
|
57
|
+
when /^GEOMETRY type/
|
58
|
+
FlydataCore::ErrorCode::UNSUPPORTED_COLUMN_TYPE_ERROR
|
59
|
+
when /^Newly registered table/
|
60
|
+
# The current agent doesn't send this error. Must be an old deprecated
|
61
|
+
# error.
|
62
|
+
FlydataCore::ErrorCode::INTERNAL_ERROR
|
63
|
+
else
|
64
|
+
# shouldn't come here
|
65
|
+
FlydataCore::ErrorCode::INTERNAL_ERROR
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
40
70
|
# Error Level
|
41
71
|
# 0 Emergency: system is unusable
|
42
72
|
# 1 Alert: action must be taken immediately
|
@@ -124,6 +124,11 @@ module FlydataCore
|
|
124
124
|
log_common(:debug, message, log_params, opt)
|
125
125
|
end
|
126
126
|
|
127
|
+
def log_debug_with_backtrace(message, log_params = {}, options = {})
|
128
|
+
opt = { depth_offset: 1}.merge(options)
|
129
|
+
log_common(:debug, message, log_params, opt.merge(backtrace: true))
|
130
|
+
end
|
131
|
+
|
127
132
|
def log_info(message, log_params = {}, options = {})
|
128
133
|
opt = { depth_offset: 1}.merge(options)
|
129
134
|
log_common(:info, message, log_params, opt)
|
@@ -134,6 +139,11 @@ module FlydataCore
|
|
134
139
|
log_common(:warn, message, log_params, opt)
|
135
140
|
end
|
136
141
|
|
142
|
+
def log_warn_with_backtrace(message, log_params = {}, options = {})
|
143
|
+
opt = { depth_offset: 1}.merge(options)
|
144
|
+
log_common(:warn, message, log_params, opt.merge(backtrace: true))
|
145
|
+
end
|
146
|
+
|
137
147
|
def log_error(message, log_params = {}, options = {})
|
138
148
|
opt = { depth_offset: 1}.merge(options)
|
139
149
|
log_common(:error, message, log_params, opt)
|
@@ -145,7 +155,9 @@ module FlydataCore
|
|
145
155
|
end
|
146
156
|
|
147
157
|
def get_logger(options = {})
|
148
|
-
options[:logger] || logger || log_context_logger
|
158
|
+
ret = options[:logger] || logger || log_context_logger
|
159
|
+
ret = Rails.logger if ret.nil? && defined?(Rails) && Rails.logger
|
160
|
+
ret || $log
|
149
161
|
end
|
150
162
|
|
151
163
|
def build_log_message(level, raw_message, log_params = {}, options = {})
|
@@ -209,8 +209,8 @@ module FlydataCore
|
|
209
209
|
include FlydataCore::CompatibilityCheck::TableExistenceCheck
|
210
210
|
TABLE_EXISTENCE_CHECK_QUERY_TMPLT = <<EOT
|
211
211
|
SELECT
|
212
|
-
t.table_schema,
|
213
|
-
t.table_name
|
212
|
+
t.table_schema as table_schema,
|
213
|
+
t.table_name as table_name
|
214
214
|
FROM
|
215
215
|
information_schema.tables t
|
216
216
|
WHERE
|
@@ -243,16 +243,21 @@ EOT
|
|
243
243
|
end
|
244
244
|
|
245
245
|
class TableTypeChecker < MysqlCompatibilityChecker
|
246
|
-
SELECT_TABLE_INFO_TMPLT =
|
247
|
-
|
248
|
-
|
249
|
-
|
246
|
+
SELECT_TABLE_INFO_TMPLT = <<EOT
|
247
|
+
SELECT
|
248
|
+
table_name as table_name,
|
249
|
+
table_type as table_type,
|
250
|
+
engine as engine
|
251
|
+
FROM information_schema.tables
|
252
|
+
WHERE table_schema = '%s' and table_name in (%s)
|
253
|
+
EOT
|
250
254
|
|
251
255
|
UNSUPPORTED_ENGINES = %w(MEMORY BLACKHOLE)
|
252
256
|
|
253
257
|
# option[:client] : Mysql2::Client object
|
254
258
|
# option[:tables] : target table list
|
255
259
|
def create_query(option = @option)
|
260
|
+
return nil if option[:tables].empty?
|
256
261
|
SELECT_TABLE_INFO_TMPLT % [
|
257
262
|
Mysql2::Client.escape(option[:database]),
|
258
263
|
option[:tables].collect{|t| "'#{Mysql2::Client.escape(t)}'"}.join(", ")
|
@@ -277,8 +282,8 @@ EOT
|
|
277
282
|
include FlydataCore::CompatibilityCheck::PrimaryKeyCheck
|
278
283
|
PK_CHECK_QUERY_TMPLT = <<EOT
|
279
284
|
SELECT
|
280
|
-
t.table_schema,
|
281
|
-
t.table_name,
|
285
|
+
t.table_schema as table_schema,
|
286
|
+
t.table_name as table_name,
|
282
287
|
SUM(IF(tc.constraint_type='PRIMARY KEY' AND col.is_nullable='NO', 1, 0)) as num_pk,
|
283
288
|
SUM(IF(tc.constraint_type='UNIQUE' AND col.is_nullable='NO', 1, 0)) as num_uk
|
284
289
|
FROM
|
@@ -303,9 +308,9 @@ EOT
|
|
303
308
|
include FlydataCore::CompatibilityCheck::PkOverrideCheck
|
304
309
|
PK_OVERRIDE_QUERY_TMPLT = <<EOT
|
305
310
|
SELECT
|
306
|
-
t.table_schema,
|
307
|
-
t.table_name,
|
308
|
-
col.column_name
|
311
|
+
t.table_schema as table_schema,
|
312
|
+
t.table_name as table_name,
|
313
|
+
col.column_name as column_name
|
309
314
|
FROM
|
310
315
|
(select * from information_schema.tables where table_schema = %{schema_name} AND table_name in (%{table_names})) t
|
311
316
|
LEFT JOIN
|
@@ -2,7 +2,7 @@ module FlydataCore
|
|
2
2
|
module Mysql
|
3
3
|
module Ssl
|
4
4
|
# ssl cipher list not including DH algorithm
|
5
|
-
NON_DH_SSL_CIPHER = "
|
5
|
+
NON_DH_SSL_CIPHER = "DEFAULT:!DH"
|
6
6
|
end
|
7
7
|
end
|
8
8
|
end
|
@@ -18,9 +18,9 @@ module FlydataCore
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def schema_and_table_in_query(option = @option)
|
21
|
-
schema = FlydataCore::Postgresql::QueryHelper.schema_as_value(option[:schema])
|
22
21
|
{
|
23
|
-
|
22
|
+
database: database_in_query(option[:database]),
|
23
|
+
schema_name: FlydataCore::Postgresql::QueryHelper.schema_as_value(option[:schema]),
|
24
24
|
table_names: table_names_in_query(option[:tables]),
|
25
25
|
}
|
26
26
|
end
|
@@ -59,6 +59,8 @@ SELECT
|
|
59
59
|
FROM
|
60
60
|
information_schema.tables
|
61
61
|
WHERE
|
62
|
+
table_catalog = %{database}
|
63
|
+
AND
|
62
64
|
table_schema = %{schema_name}
|
63
65
|
AND
|
64
66
|
table_name in (%{table_names})
|
@@ -71,17 +73,31 @@ EOT
|
|
71
73
|
include FlydataCore::CompatibilityCheck::PrimaryKeyCheck
|
72
74
|
PK_CHECK_QUERY_TMPLT = <<EOT
|
73
75
|
SELECT
|
74
|
-
|
75
|
-
|
76
|
+
c.table_schema,
|
77
|
+
c.table_name
|
76
78
|
FROM
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
79
|
+
pg_index i
|
80
|
+
JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
|
81
|
+
RIGHT JOIN
|
82
|
+
(SELECT
|
83
|
+
(table_schema ||'.'|| table_name)::regclass AS regid,
|
84
|
+
*
|
85
|
+
FROM information_schema.columns
|
86
|
+
WHERE
|
87
|
+
table_catalog = %{database}
|
88
|
+
AND table_schema = %{schema_name}
|
89
|
+
AND table_name IN (%{table_names})
|
90
|
+
) c
|
91
|
+
ON i.indrelid = c.regid AND a.attname = c.column_name
|
92
|
+
WHERE
|
93
|
+
c.table_catalog = %{database}
|
94
|
+
AND c.table_schema = %{schema_name}
|
95
|
+
AND c.table_name IN (%{table_names})
|
81
96
|
GROUP BY
|
82
|
-
|
97
|
+
c.table_schema, c.table_name
|
83
98
|
HAVING
|
84
|
-
SUM(CASE WHEN
|
99
|
+
SUM(CASE WHEN i.indisprimary='t' THEN 1 ELSE 0 END) = 0 AND
|
100
|
+
SUM(CASE WHEN i.indisunique='t' THEN 1 ELSE 0 END) = 0;
|
85
101
|
EOT
|
86
102
|
end
|
87
103
|
|
@@ -93,10 +109,10 @@ SELECT
|
|
93
109
|
t.table_name,
|
94
110
|
col.column_name
|
95
111
|
FROM
|
96
|
-
(select * from information_schema.tables where table_schema = %{schema_name} AND table_name in (%{table_names})) t
|
112
|
+
(select * from information_schema.tables where table_catalog = %{database} AND table_schema = %{schema_name} AND table_name in (%{table_names})) t
|
97
113
|
LEFT JOIN
|
98
|
-
(select * from information_schema.columns where table_schema = %{schema_name} AND table_name in (%{table_names})) col
|
99
|
-
ON t.table_schema = col.table_schema AND t.table_name = col.table_name
|
114
|
+
(select * from information_schema.columns where table_catalog = %{database} AND table_schema = %{schema_name} AND table_name in (%{table_names})) col
|
115
|
+
ON t.table_catalog = col.table_catalog AND t.table_schema = col.table_schema AND t.table_name = col.table_name
|
100
116
|
ORDER BY
|
101
117
|
t.table_name;
|
102
118
|
EOT
|
@@ -49,6 +49,7 @@ class MysqlTableDef < Base
|
|
49
49
|
'float' => {type: 'float4'},
|
50
50
|
'int' => {type: 'int4', def_width: '11'},
|
51
51
|
'integer' => {type: 'int4', def_width: '11'},
|
52
|
+
'json' => {type: 'json'},
|
52
53
|
'longblob' => {type: 'varbinary(4294967295)'},
|
53
54
|
'longtext' => {type: 'text'},
|
54
55
|
'mediumblob' => {type: 'varbinary(16777215)'},
|
@@ -33,6 +33,7 @@ class RedshiftTableDef
|
|
33
33
|
'int4 unsigned' => {type: 'int8', unsigned: true, default_value: '0'},
|
34
34
|
'int8' => {type: 'int8', default_value: '0'},
|
35
35
|
'int8 unsigned' => {type: 'numeric(20,0)', unsigned: true, default_value: '0'},
|
36
|
+
'json' => {type: 'varchar(max)', default_value: ''},
|
36
37
|
'money' => {type: 'numeric', use_params: true, max_size: [38,37], default_value: '0'},
|
37
38
|
'numeric' => {type: 'numeric', use_params: true, default_params: [18,8], max_size: [38,37], default_value: '0'},
|
38
39
|
'numeric unsigned' => {type: 'numeric', use_params: true, default_params: [18,8], max_size: [38,37], default_value: '0'},
|
@@ -87,8 +87,8 @@ module FlydataCore
|
|
87
87
|
subject { subject_object.create_query }
|
88
88
|
it { is_expected.to eq <<EOT
|
89
89
|
SELECT
|
90
|
-
t.table_schema,
|
91
|
-
t.table_name
|
90
|
+
t.table_schema as table_schema,
|
91
|
+
t.table_name as table_name
|
92
92
|
FROM
|
93
93
|
information_schema.tables t
|
94
94
|
WHERE
|
@@ -99,6 +99,13 @@ UNION
|
|
99
99
|
SELECT 'test_db', '';
|
100
100
|
EOT
|
101
101
|
}
|
102
|
+
|
103
|
+
context 'when tables is empty' do
|
104
|
+
before do
|
105
|
+
option[:tables] = []
|
106
|
+
end
|
107
|
+
it { is_expected.to be_nil }
|
108
|
+
end
|
102
109
|
end
|
103
110
|
|
104
111
|
describe '#check_reesult' do
|
@@ -137,8 +144,8 @@ EOT
|
|
137
144
|
subject { subject_object.create_query }
|
138
145
|
it { is_expected.to eq <<EOT
|
139
146
|
SELECT
|
140
|
-
t.table_schema,
|
141
|
-
t.table_name,
|
147
|
+
t.table_schema as table_schema,
|
148
|
+
t.table_name as table_name,
|
142
149
|
SUM(IF(tc.constraint_type='PRIMARY KEY' AND col.is_nullable='NO', 1, 0)) as num_pk,
|
143
150
|
SUM(IF(tc.constraint_type='UNIQUE' AND col.is_nullable='NO', 1, 0)) as num_uk
|
144
151
|
FROM
|
@@ -167,8 +174,8 @@ EOT
|
|
167
174
|
end
|
168
175
|
it { is_expected.to eq <<EOT
|
169
176
|
SELECT
|
170
|
-
t.table_schema,
|
171
|
-
t.table_name,
|
177
|
+
t.table_schema as table_schema,
|
178
|
+
t.table_name as table_name,
|
172
179
|
SUM(IF(tc.constraint_type='PRIMARY KEY' AND col.is_nullable='NO', 1, 0)) as num_pk,
|
173
180
|
SUM(IF(tc.constraint_type='UNIQUE' AND col.is_nullable='NO', 1, 0)) as num_uk
|
174
181
|
FROM
|
@@ -243,9 +250,9 @@ EOT
|
|
243
250
|
end
|
244
251
|
it { is_expected.to eq <<EOT
|
245
252
|
SELECT
|
246
|
-
t.table_schema,
|
247
|
-
t.table_name,
|
248
|
-
col.column_name
|
253
|
+
t.table_schema as table_schema,
|
254
|
+
t.table_name as table_name,
|
255
|
+
col.column_name as column_name
|
249
256
|
FROM
|
250
257
|
(select * from information_schema.tables where table_schema = 'test_db' AND table_name in ('table_1','table_2')) t
|
251
258
|
LEFT JOIN
|
@@ -54,6 +54,8 @@ SELECT
|
|
54
54
|
FROM
|
55
55
|
information_schema.tables
|
56
56
|
WHERE
|
57
|
+
table_catalog = 'test_db'
|
58
|
+
AND
|
57
59
|
table_schema = (select current_schema)
|
58
60
|
AND
|
59
61
|
table_name in ('table_1','table_2','table_3')
|
@@ -71,6 +73,8 @@ SELECT
|
|
71
73
|
FROM
|
72
74
|
information_schema.tables
|
73
75
|
WHERE
|
76
|
+
table_catalog = 'test_db'
|
77
|
+
AND
|
74
78
|
table_schema = 'test_schema'
|
75
79
|
AND
|
76
80
|
table_name in ('table_1','table_2','table_3')
|
@@ -120,17 +124,31 @@ EOT
|
|
120
124
|
context 'when schema is not set' do
|
121
125
|
it { is_expected.to eq <<EOT
|
122
126
|
SELECT
|
123
|
-
|
124
|
-
|
127
|
+
c.table_schema,
|
128
|
+
c.table_name
|
125
129
|
FROM
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
+
pg_index i
|
131
|
+
JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
|
132
|
+
RIGHT JOIN
|
133
|
+
(SELECT
|
134
|
+
(table_schema ||'.'|| table_name)::regclass AS regid,
|
135
|
+
*
|
136
|
+
FROM information_schema.columns
|
137
|
+
WHERE
|
138
|
+
table_catalog = 'test_db'
|
139
|
+
AND table_schema = (select current_schema)
|
140
|
+
AND table_name IN ('table_1','table_2','table_3')
|
141
|
+
) c
|
142
|
+
ON i.indrelid = c.regid AND a.attname = c.column_name
|
143
|
+
WHERE
|
144
|
+
c.table_catalog = 'test_db'
|
145
|
+
AND c.table_schema = (select current_schema)
|
146
|
+
AND c.table_name IN ('table_1','table_2','table_3')
|
130
147
|
GROUP BY
|
131
|
-
|
148
|
+
c.table_schema, c.table_name
|
132
149
|
HAVING
|
133
|
-
SUM(CASE WHEN
|
150
|
+
SUM(CASE WHEN i.indisprimary='t' THEN 1 ELSE 0 END) = 0 AND
|
151
|
+
SUM(CASE WHEN i.indisunique='t' THEN 1 ELSE 0 END) = 0;
|
134
152
|
EOT
|
135
153
|
}
|
136
154
|
end
|
@@ -139,17 +157,31 @@ EOT
|
|
139
157
|
before { option.merge!(schema: 'test_schema') }
|
140
158
|
it { is_expected.to eq <<EOT
|
141
159
|
SELECT
|
142
|
-
|
143
|
-
|
160
|
+
c.table_schema,
|
161
|
+
c.table_name
|
144
162
|
FROM
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
163
|
+
pg_index i
|
164
|
+
JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
|
165
|
+
RIGHT JOIN
|
166
|
+
(SELECT
|
167
|
+
(table_schema ||'.'|| table_name)::regclass AS regid,
|
168
|
+
*
|
169
|
+
FROM information_schema.columns
|
170
|
+
WHERE
|
171
|
+
table_catalog = 'test_db'
|
172
|
+
AND table_schema = 'test_schema'
|
173
|
+
AND table_name IN ('table_1','table_2','table_3')
|
174
|
+
) c
|
175
|
+
ON i.indrelid = c.regid AND a.attname = c.column_name
|
176
|
+
WHERE
|
177
|
+
c.table_catalog = 'test_db'
|
178
|
+
AND c.table_schema = 'test_schema'
|
179
|
+
AND c.table_name IN ('table_1','table_2','table_3')
|
149
180
|
GROUP BY
|
150
|
-
|
181
|
+
c.table_schema, c.table_name
|
151
182
|
HAVING
|
152
|
-
SUM(CASE WHEN
|
183
|
+
SUM(CASE WHEN i.indisprimary='t' THEN 1 ELSE 0 END) = 0 AND
|
184
|
+
SUM(CASE WHEN i.indisunique='t' THEN 1 ELSE 0 END) = 0;
|
153
185
|
EOT
|
154
186
|
}
|
155
187
|
end
|
@@ -202,10 +234,10 @@ SELECT
|
|
202
234
|
t.table_name,
|
203
235
|
col.column_name
|
204
236
|
FROM
|
205
|
-
(select * from information_schema.tables where table_schema = (select current_schema) AND table_name in ('table_1','table_2')) t
|
237
|
+
(select * from information_schema.tables where table_catalog = 'test_db' AND table_schema = (select current_schema) AND table_name in ('table_1','table_2')) t
|
206
238
|
LEFT JOIN
|
207
|
-
(select * from information_schema.columns where table_schema = (select current_schema) AND table_name in ('table_1','table_2')) col
|
208
|
-
ON t.table_schema = col.table_schema AND t.table_name = col.table_name
|
239
|
+
(select * from information_schema.columns where table_catalog = 'test_db' AND table_schema = (select current_schema) AND table_name in ('table_1','table_2')) col
|
240
|
+
ON t.table_catalog = col.table_catalog AND t.table_schema = col.table_schema AND t.table_name = col.table_name
|
209
241
|
ORDER BY
|
210
242
|
t.table_name;
|
211
243
|
EOT
|
@@ -44,6 +44,7 @@ describe MysqlTableDef do
|
|
44
44
|
{:column=>"col_float_4_2", :type=>"float4(4,2)", :default=>nil},
|
45
45
|
{:column=>"col_int", :type=>"int4(11)", :default=>nil},
|
46
46
|
{:column=>"col_int_6", :type=>"int4(6)", :default=>nil},
|
47
|
+
{:column=>"col_json", :type=>"json", :default=>nil},
|
47
48
|
{:column=>"col_longblob", :type=>"varbinary(4294967295)"},
|
48
49
|
{:column=>"col_longtext", :type=>"text"},
|
49
50
|
{:column=>"col_mediumblob", :type=>"varbinary(16777215)"},
|
@@ -88,6 +89,7 @@ describe MysqlTableDef do
|
|
88
89
|
`col_float_4_2` float(4,2) DEFAULT NULL,
|
89
90
|
`col_int` int(11) DEFAULT NULL,
|
90
91
|
`col_int_6` int(6) DEFAULT NULL,
|
92
|
+
`col_json` json DEFAULT NULL,
|
91
93
|
`col_longblob` longblob,
|
92
94
|
`col_longtext` longtext,
|
93
95
|
`col_mediumblob` mediumblob,
|
@@ -67,6 +67,7 @@ CREATE TABLE IF NOT EXISTS "test_table_all" (
|
|
67
67
|
"col_float_4_2" float4 DEFAULT NULL,
|
68
68
|
"col_int" int4 DEFAULT NULL,
|
69
69
|
"col_int_6" int4 DEFAULT NULL,
|
70
|
+
"col_json" varchar(max) DEFAULT NULL,
|
70
71
|
"col_longblob" varchar(65535),
|
71
72
|
"col_longtext" varchar(max),
|
72
73
|
"col_mediumblob" varchar(65535),
|
@@ -101,6 +102,7 @@ CREATE TABLE "test_table_all" (
|
|
101
102
|
"col_float_4_2" float4 DEFAULT NULL,
|
102
103
|
"col_int" int4 DEFAULT NULL,
|
103
104
|
"col_int_6" int4 DEFAULT NULL,
|
105
|
+
"col_json" varchar(max) DEFAULT NULL,
|
104
106
|
"col_longblob" varchar(65535),
|
105
107
|
"col_longtext" varchar(max),
|
106
108
|
"col_mediumblob" varchar(65535),
|
@@ -135,23 +137,24 @@ INSERT INTO "flydata_ctl_columns" (table_name, column_name, src_data_type, ordin
|
|
135
137
|
('test_table_all', 'col_float_4_2', 'float4(4,2)', 11),
|
136
138
|
('test_table_all', 'col_int', 'int4(11)', 12),
|
137
139
|
('test_table_all', 'col_int_6', 'int4(6)', 13),
|
138
|
-
('test_table_all', '
|
139
|
-
('test_table_all', '
|
140
|
-
('test_table_all', '
|
141
|
-
('test_table_all', '
|
142
|
-
('test_table_all', '
|
143
|
-
('test_table_all', '
|
144
|
-
('test_table_all', '
|
145
|
-
('test_table_all', '
|
146
|
-
('test_table_all', '
|
147
|
-
('test_table_all', '
|
148
|
-
('test_table_all', '
|
149
|
-
('test_table_all', '
|
150
|
-
('test_table_all', '
|
151
|
-
('test_table_all', '
|
152
|
-
('test_table_all', '
|
153
|
-
('test_table_all', '
|
154
|
-
('test_table_all', '
|
140
|
+
('test_table_all', 'col_json', 'json', 14),
|
141
|
+
('test_table_all', 'col_longblob', 'varbinary(4294967295)', 15),
|
142
|
+
('test_table_all', 'col_longtext', 'text', 16),
|
143
|
+
('test_table_all', 'col_mediumblob', 'varbinary(16777215)', 17),
|
144
|
+
('test_table_all', 'col_mediumint', 'int3(9)', 18),
|
145
|
+
('test_table_all', 'col_mediumtext', 'text', 19),
|
146
|
+
('test_table_all', 'col_smallint', 'int2(6)', 20),
|
147
|
+
('test_table_all', 'col_text', 'text', 21),
|
148
|
+
('test_table_all', 'col_time', 'time', 22),
|
149
|
+
('test_table_all', 'col_timestamp', 'datetime', 23),
|
150
|
+
('test_table_all', 'col_tinyblob', 'varbinary(255)', 24),
|
151
|
+
('test_table_all', 'col_tinyint', 'int1(4)', 25),
|
152
|
+
('test_table_all', 'col_tinytext', 'text', 26),
|
153
|
+
('test_table_all', 'col_varbinary', 'varbinary(512)', 27),
|
154
|
+
('test_table_all', 'col_varchar', 'varchar(372)', 28),
|
155
|
+
('test_table_all', 'col_year', 'year', 29),
|
156
|
+
('test_table_all', 'col_year_4', 'year(4)', 30),
|
157
|
+
('test_table_all', 'col_year_2', 'year(2)', 31);
|
155
158
|
DELETE FROM "flydata_ctl_tables" WHERE table_name = 'test_table_all';
|
156
159
|
INSERT INTO "flydata_ctl_tables" (table_name, attribute, value) VALUES
|
157
160
|
('test_table_all', 'cs', 'UTF_8'),
|
@@ -170,6 +173,7 @@ INSERT INTO "flydata_ctl_tables" (table_name, attribute, value) VALUES
|
|
170
173
|
`col_float_4_2` float(4,2) DEFAULT NULL,
|
171
174
|
`col_int` int(11) DEFAULT NULL,
|
172
175
|
`col_int_6` int(6) DEFAULT NULL,
|
176
|
+
`col_json` json DEFAULT NULL,
|
173
177
|
`col_longblob` longblob,
|
174
178
|
`col_longtext` longtext,
|
175
179
|
`col_mediumblob` mediumblob,
|
@@ -36,6 +36,7 @@ CREATE TABLE `test_table_all` (
|
|
36
36
|
`col_float_4_2` float(4,2) DEFAULT NULL,
|
37
37
|
`col_int` int(11) DEFAULT NULL,
|
38
38
|
`col_int_6` int(6) DEFAULT NULL,
|
39
|
+
`col_json` json DEFAULT NULL,
|
39
40
|
`col_longblob` longblob,
|
40
41
|
`col_longtext` longtext,
|
41
42
|
`col_mediumblob` mediumblob,
|
@@ -731,6 +731,21 @@ EOT
|
|
731
731
|
it_behaves_like *examples
|
732
732
|
end
|
733
733
|
end
|
734
|
+
|
735
|
+
context 'with json column def' do
|
736
|
+
before do
|
737
|
+
column[:column] = "value_json"
|
738
|
+
column[:type] = "json"
|
739
|
+
end
|
740
|
+
let(:type_sql) { %Q|"value_json" varchar(max)| }
|
741
|
+
let(:not_null_default_sql) { " DEFAULT '{}'" }
|
742
|
+
|
743
|
+
context 'when default_value is normal' do
|
744
|
+
let(:default_value) { "{}" }
|
745
|
+
let(:default_value_sql) { "'{}'" }
|
746
|
+
it_behaves_like *examples
|
747
|
+
end
|
748
|
+
end
|
734
749
|
end
|
735
750
|
|
736
751
|
context 'for create table' do
|
data/flydata.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "flydata"
|
8
|
-
s.version = "0.7.
|
8
|
+
s.version = "0.7.14"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Koichi Fujikawa", "Masashi Miyazaki", "Matthew Luu", "Mak Inada", "Sriram NS"]
|
12
|
-
s.date = "2016-
|
12
|
+
s.date = "2016-12-02"
|
13
13
|
s.description = "FlyData Agent"
|
14
14
|
s.email = "sysadmin@flydata.com"
|
15
15
|
s.executables = ["fdredshift", "flydata", "serverinfo", "split_sync_ddl.rb"]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flydata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Koichi Fujikawa
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2016-
|
15
|
+
date: 2016-12-02 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: rest-client
|