real_data_tests 0.3.5 → 0.3.6

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: 35d81ac18056a163df010e92d75c5bd36896836d070f8c74041048ab98918cdf
4
- data.tar.gz: 50d5df4a36a88f58b6dbc76494db155bc68b5b9ca1cf8cbd45b22a4bd8cd6166
3
+ metadata.gz: 179a591f6a485c397255c0cbec27e18757e2f7fdc450f7292f279cd681f91e0b
4
+ data.tar.gz: bb9b9f4f60b609f2ea8a901689b4b9b8d5ddfdc7d36e867c18ebbe24855cb5aa
5
5
  SHA512:
6
- metadata.gz: fb2bf7729c1b3a0c86a073924b8c50b0a2005885d93acb7bdd419f12db87e858801222235c6a1c437144b53f57b9375ee56e76c467e6b1d4e643a403131153c9
7
- data.tar.gz: ff37ab1ab9d6c2b33efb657905bb682c4d99cd22a7533e8b19db95d9949f11e621f0d750fbb829f8d61c377faa64d008c66bcdd703a072fae349d4d80c369ab2
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
- 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
- # Properly quote UUIDs and strings in the VALUES part
113
- values_part = parts[1]
114
- values_part = values_part.gsub(/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})(?=[,\s)])/i, "'\\1'")
115
- # Quote unquoted string values
116
- values_part = values_part.gsub(/,\s*([^',\s][^,\s]*)(?=[,\s)])/, ", '\\1'")
117
- # Reassemble the statement
118
- statement = parts[0] + 'VALUES (' + values_part
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
- statement
123
- end
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RealDataTests
4
- VERSION = "0.3.5"
4
+ VERSION = "0.3.6"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: real_data_tests
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Dias