require 'spec_helper' require 'nuodb' def notlessthan12 not ['1.0.1','1.0.2','1.1','1.1.1'].include?(ENV['NUODB_VERSION']) end describe NuoDB::Statement do attr_reader :connection before(:all) do @connection = BaseTest.connect end check_drop_table_ddl = 'DROP TABLE CASCADE IF EXISTS test_generated_keys' after(:all) do end context "inserting with always generated keys" do create_table_ddl = 'CREATE TABLE test_generated_keys (id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY, data INTEGER DEFAULT (5) NOT NULL);' attr_reader :statement before(:each) do @statement = @connection.statement statement.execute(check_drop_table_ddl) statement.execute(create_table_ddl) (1..10).each do |value| statement.execute "INSERT INTO test_generated_keys (data) VALUES (#{value})" end end after(:each) do statement.execute(check_drop_table_ddl) end it "should raise an error when attempting to provide your own key" do lambda { statement.execute("INSERT INTO test_generated_keys (id, data) VALUES (1,5)") }.should raise_error(NuoDB::DatabaseError, /can't assign a value to generated always identity/) end it "generated_keys should return the most recently created generated key" do statement.execute("SELECT * FROM test_generated_keys").should be_true value_results = statement.results value_rows = value_results.rows value_rows.length.should eql(10) last_generated_id = value_rows.last[0] prev_generated_id = nil (1..10).each do |value| statement.execute("INSERT INTO test_generated_keys (data) VALUES (#{value})").should be_false keys_results = statement.generated_keys keys_rows = keys_results.rows keys_results.rows.should eql(keys_rows) keys_rows.length.should eql(1) keys_rows.last[0].should_not eql(last_generated_id) keys_rows.last[0].should_not eql(prev_generated_id) prev_generated_id = keys_rows.last[0] end end end context "inserting with default generated keys" do create_table_ddl = 'CREATE TABLE test_generated_keys (id INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, data INTEGER DEFAULT (5) NOT NULL);' attr_reader :statement before(:each) do @statement = @connection.statement statement.execute(check_drop_table_ddl) statement.execute(create_table_ddl) (1..10).each do |value| statement.execute "INSERT INTO test_generated_keys (data) VALUES (#{value})" end end after(:each) do statement.execute(check_drop_table_ddl) end it "should not raise an error when attempting to provide your own key" do lambda { statement.execute("INSERT INTO test_generated_keys (id, data) VALUES (1,5)") }.should_not raise_error(NuoDB::DatabaseError, /can't assign a value to generated always identity/) end it "should raise an error when attempting to provide your own key and its a dupe", :if => notlessthan12 do lambda { statement.execute("INSERT INTO test_generated_keys (id, data) VALUES (1,5)") }.should raise_error(NuoDB::DatabaseError, /duplicate value in unique index TEST_GENERATED_KEYS..PRIMARY_KEY/) end it "generated_keys should return the most recently created generated key" do statement.execute("SELECT * FROM test_generated_keys").should be_true value_results = statement.results value_rows = value_results.rows value_rows.length.should eql(10) last_generated_id = value_rows.last[0] prev_generated_id = nil (1..10).each do |value| statement.execute("INSERT INTO test_generated_keys (data) VALUES (#{value})").should be_false keys_results = statement.generated_keys keys_rows = keys_results.rows keys_rows.length.should eql(1) keys_rows.last[0].should_not eql(last_generated_id) keys_rows.last[0].should_not eql(prev_generated_id) prev_generated_id = keys_rows.last[0] end end it "generated_keys should skip manually provided ones" do statement.execute("INSERT INTO test_generated_keys (id, data) VALUES (2500,5)") statement.execute("SELECT * FROM test_generated_keys").should be_true value_results = statement.results value_rows = value_results.rows value_rows.length.should eql(11) last_generated_id = value_rows.last[0] prev_generated_id = nil (1..1000).each do |value| statement.execute("INSERT INTO test_generated_keys (data) VALUES (#{value})").should be_false keys_results = statement.generated_keys keys_rows = keys_results.rows keys_rows.length.should eql(1) keys_rows.last[0].should_not eql(last_generated_id) keys_rows.last[0].should_not eql(prev_generated_id) prev_generated_id = keys_rows.last[0] end end end end