real_data_tests 0.3.5 → 0.3.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/lib/real_data_tests/rspec_helper.rb +73 -15
- data/lib/real_data_tests/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 179a591f6a485c397255c0cbec27e18757e2f7fdc450f7292f279cd681f91e0b
|
4
|
+
data.tar.gz: bb9b9f4f60b609f2ea8a901689b4b9b8d5ddfdc7d36e867c18ebbe24855cb5aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a47d49d690958e70cd324ede48dadce7d3e9e7bd39471ee052879d6fe5646ad308aebbf05f79cb92ebe3c9b7ede94b0163c74efdddf3f518ef47518a489a2ee6
|
7
|
+
data.tar.gz: a4c6a97cff1bd02096064fd1da67580dd9307ce29f4e7d5a8be4d82c9f352b97009ef1fc22eb555dc39b1b87599947680a61bc2bc376c2cd14a7f8cc5397892d
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [0.3.6] - 2025-01-14
|
4
|
+
### Fixed
|
5
|
+
- Further enhanced SQL statement handling in native loader
|
6
|
+
- Fixed handling of SQL statements with ON CONFLICT clauses
|
7
|
+
- Improved quoting for company names containing spaces
|
8
|
+
- Added proper handling of trailing semicolons
|
9
|
+
- Enhanced detection and preservation of SQL statement structure
|
10
|
+
|
3
11
|
## [0.3.5] - 2025-01-14
|
4
12
|
### Fixed
|
5
13
|
- Enhanced SQL statement handling in native loader
|
@@ -103,23 +103,81 @@ module RealDataTests
|
|
103
103
|
statements
|
104
104
|
end
|
105
105
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
106
|
+
def clean_sql_statement(statement)
|
107
|
+
# Handle VALUES clause formatting
|
108
|
+
if statement.include?('VALUES')
|
109
|
+
# Split into pre-VALUES and VALUES parts
|
110
|
+
parts = statement.split(/VALUES\s*\(/i, 2)
|
111
|
+
if parts.length == 2
|
112
|
+
# Get the column names from the first part
|
113
|
+
column_names = parts[0].scan(/\((.*?)\)/).flatten.first&.split(',')&.map(&:strip) || []
|
114
|
+
|
115
|
+
# Split values into individual items
|
116
|
+
values_part = parts[1]
|
117
|
+
values = split_values(values_part)
|
118
|
+
|
119
|
+
# Process each value according to its column and position
|
120
|
+
values.each_with_index do |value, i|
|
121
|
+
# Skip if already properly quoted
|
122
|
+
next if value.start_with?("'") && value.end_with?("'")
|
123
|
+
|
124
|
+
# Quote UUIDs
|
125
|
+
if value.match?(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i)
|
126
|
+
values[i] = "'#{value}'"
|
127
|
+
# Quote any non-NULL string values that contain spaces or special characters
|
128
|
+
elsif !['NULL', 'true', 'false'].include?(value) &&
|
129
|
+
!value.match?(/^\d+$/) && # not a number
|
130
|
+
!value.start_with?("'{") && # not a JSON object
|
131
|
+
!value.start_with?("'") # not already quoted
|
132
|
+
values[i] = "'#{value}'"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# Reassemble the statement with any trailing ON CONFLICT clause
|
137
|
+
remainder = values_part.match(/\)\s*(ON\s+CONFLICT.*?)(;?\s*$)/i)
|
138
|
+
statement = parts[0] + 'VALUES (' + values.join(', ') + ')'
|
139
|
+
statement += " #{remainder[1]};" if remainder
|
140
|
+
end
|
119
141
|
end
|
142
|
+
|
143
|
+
statement
|
120
144
|
end
|
121
145
|
|
122
|
-
|
123
|
-
|
146
|
+
def split_values(values_part)
|
147
|
+
values = []
|
148
|
+
current_value = ''
|
149
|
+
in_quotes = false
|
150
|
+
in_json = false
|
151
|
+
depth = 0
|
152
|
+
|
153
|
+
values_part.chars.each_with_index do |char, i|
|
154
|
+
case char
|
155
|
+
when "'"
|
156
|
+
# Toggle quote state if not escaped
|
157
|
+
if i == 0 || values_part[i-1] != '\\'
|
158
|
+
in_quotes = !in_quotes
|
159
|
+
end
|
160
|
+
when '{'
|
161
|
+
depth += 1 unless in_quotes
|
162
|
+
in_json = true unless in_quotes
|
163
|
+
when '}'
|
164
|
+
depth -= 1 unless in_quotes
|
165
|
+
when ','
|
166
|
+
if !in_quotes && depth == 0
|
167
|
+
values << current_value.strip
|
168
|
+
current_value = ''
|
169
|
+
next
|
170
|
+
end
|
171
|
+
end
|
172
|
+
current_value << char
|
173
|
+
end
|
174
|
+
|
175
|
+
# Add the last value (remove trailing ';' or ')')
|
176
|
+
last_value = current_value.strip
|
177
|
+
last_value = last_value[0..-2] if last_value.end_with?(';', ')')
|
178
|
+
values << last_value
|
179
|
+
|
180
|
+
values
|
181
|
+
end
|
124
182
|
end
|
125
183
|
end
|