diff --git a/server/lib/utils/payload_generator/dynamic_sql.rb b/server/lib/utils/payload_generator/dynamic_sql.rb index f2f02528a..3eede829a 100644 --- a/server/lib/utils/payload_generator/dynamic_sql.rb +++ b/server/lib/utils/payload_generator/dynamic_sql.rb @@ -9,13 +9,26 @@ def self.generate_query(model, harvest_values) input_config.each do |config| dynamic_var_name = ":#{config['name']}" - dynamic_var_value = config["value_type"] == "static" ? config["value"] : harvest_values[config["name"]] + raw_value = config["value_type"] == "static" ? config["value"] : harvest_values[config["name"]] + dynamic_var_value = if config["type"] == "string" + if already_quoted?(dynamic_query, dynamic_var_name) + raw_value.gsub("'", "''") + else + "'#{raw_value.gsub("'", "''")}'" + end + else + raw_value.to_s + end dynamic_query.gsub!(dynamic_var_name, dynamic_var_value) end dynamic_query end + + def self.already_quoted?(query, placeholder) + query.match?(/'\s*#{Regexp.escape(placeholder)}\s*'/) + end end end end diff --git a/server/spec/lib/utils/payload_generator/dynamic_sql_spec.rb b/server/spec/lib/utils/payload_generator/dynamic_sql_spec.rb index dcb5eef09..8a3324b19 100644 --- a/server/spec/lib/utils/payload_generator/dynamic_sql_spec.rb +++ b/server/spec/lib/utils/payload_generator/dynamic_sql_spec.rb @@ -25,16 +25,43 @@ query: "SELECT * FROM public.actor WHERE name=':name' AND age=:age AND gender=':gender'") end + let!(:dynamic_sql_model_not_quoted) do + create(:model, query_type: :dynamic_sql, connector: dynamic_sql_connector, + configuration: { + json_schema: { + input: [{ "name" => "name", + "type" => "string", "value" => "", "value_type" => "dynamic" }, + { "name" => "age", + "type" => "number", "value" => "22", "value_type" => "static" }, + { "name" => "gender", + "type" => "string", "value" => "", "value_type" => "dynamic" }], + output: [] + }, + harvesters: [] + }, + query: "SELECT * FROM public.actor WHERE name=:name AND age=:age AND gender=:gender") + end + let(:harvesters) do { "name" => "first_name", "gender" => "female" } end + let(:harvesters_not_quoted) do + { "name" => "last_name", "gender" => "male" } + end + context "when correct input and harvest values are provided" do it "replaces dynamic query values and return raw query" do expected_query = "SELECT * FROM public.actor WHERE name='first_name' AND age=22 AND gender='female'" generated_query = described_class.generate_query(dynamic_sql_model, harvesters) expect(generated_query).to eq(expected_query) end + + it "replaces dynamic query values and return raw query" do + expected_query = "SELECT * FROM public.actor WHERE name='last_name' AND age=22 AND gender='male'" + generated_query = described_class.generate_query(dynamic_sql_model_not_quoted, harvesters_not_quoted) + expect(generated_query).to eq(expected_query) + end end end end