


Begin;
Initialize;
InitializeSession "";
Command "create database TESTDB";
TerminateSession;

InitializeSession "TESTDB";

######################################################################
#3-1の検査(初期状態から)
#以下のような表を定義する
#
#create table T (f int, g int generated by default as identity (get max), h int);

Command "create table T (f int, g int generated by default as identity (get max), h int)";

#g に値を指定しないで数件の挿入を数回繰り返す
#
#insert T(f, h) values (1, 10), (2, 20), (3, 30);
#insert T(f, h) values (4, 40), (5, 50), (6, 60);
#
#g の値が 0 から順に与えられていることを確認する
#
#select * from T;
#⇒ 期待結果:
#	{1, 0, 10}
#	{2, 1, 20}
#	{3, 2, 30}
#	{4, 3, 40}
#	{5, 4, 50}
#	{6, 5, 60}

Command "insert T(f, h) values (1, 10), (2, 20), (3, 30)";
Command "insert T(f, h) values (4, 40), (5, 50), (6, 60)";

Command "select * from T";

######################################################################


######################################################################
#3-2の検査(登録済みから) 3-1(登録済みから)
#引き続いて g に現在値より小さい値を指定して数件の挿入を数回繰り返す
#
#insert T values (10, 1, 100), (20, 2, 200), (30, 3, 300);
#insert T values (11, 1, 110), (22, 2, 220), (33, 3, 330);
#
#g の値が指定された値になっていることを確認する
#
#select * from T where f > 10;
#⇒ 期待結果:
#	{10, 1, 100}
#	{20, 2, 200}
#	{30, 3, 300}
#	{11, 1, 110}
#	{22, 2, 220}
#	{33, 3, 330}

Command "insert T values (10, 1, 100), (20, 2, 200), (30, 3, 300)";
Command "insert T values (11, 1, 110), (22, 2, 220), (33, 3, 330)";

Command "select * from T where f >= 10";

#さらに g に値を指定しないで数件の挿入を数回繰り返す
#
#insert T(f, h) values (100, 1000), (200, 2000), (300, 3000);
#insert T(f, h) values (400, 4000), (500, 5000), (600, 6000);
#
#g の値が前回自動割当された続きになっていることを確認する
#
#select * from T where f >= 100;
#⇒ 期待結果:
#	{100, 6, 1000}
#	{200, 7, 2000}
#	{300, 8, 3000}
#	{400, 9, 4000}
#	{500, 10, 5000}
#	{600, 11, 6000}

Command "insert T(f, h) values (100, 1000), (200, 2000), (300, 3000)";
Command "insert T(f, h) values (400, 4000), (500, 5000), (600, 6000)";

Command "select * from T where f >= 100";

#次に g に現在値より大きい値を指定して数件の挿入を数回繰り返す
#
#insert T values (1000, 100, 10000), (2000, 200, 20000), (3000, 300, 30000);
#insert T values (4000, 400, 40000), (6000, 600, 60000), (5000, 500, 50000); -- 真ん中が最大
#
#g の値が指定された値になっていることを確認する
#
#select * from T where f >= 1000;
#⇒ 期待結果:
#	{1000, 100, 10000}
#	{2000, 200, 20000}
#	{3000, 300, 30000}
#	{6000, 600, 60000}
#	{5000, 500, 50000}
#	{4000, 400, 40000}

Command "insert T values (1000, 100, 10000), (2000, 200, 20000), (3000, 300, 30000)";
Command "insert T values (4000, 400, 40000), (6000, 600, 60000), (5000, 500, 50000)";

Command "select * from T where f >= 1000";

#さらに g に値を指定しないで数件の挿入を数回繰り返す
#
#insert T(f, h) values (10000, 100000), (20000, 200000), (30000, 300000);
#insert T(f, h) values (40000, 400000), (50000, 500000), (60000, 600000);
#
#g の値がこれまでの最大値(600)の続きになっていることを確認する
#
#select * from T where f >= 10000;
#⇒ 期待結果:
#	{10000, 601, 100000}
#	{20000, 602, 200000}
#	{30000, 603, 300000}
#	{40000, 604, 400000}
#	{50000, 605, 500000}
#	{60000, 606, 600000}

Command "insert T(f, h) values (10000, 100000), (20000, 200000), (30000, 300000)";
Command "insert T(f, h) values (40000, 400000), (50000, 500000), (60000, 600000)";

Command "select * from T where f >= 10000";

######################################################################


######################################################################
#3-2の検査（初期状態から）
#表を作り直す
#
#drop table T;
#create table T (f int, g int generated by default as identity (get max), h int);

Command "drop table T";
Command "create table T (f int, g int generated by default as identity (get max), h int)";

#g に値を指定して数件の挿入を数回繰り返す
#
#insert T values (90, 9, 900), (40, 4, 400), (50, 5, 500); -- 最初が最大値
#insert T values (60, 6, 600), (70, 7, 700), (80, 8, 800);
#
#g の値が指定された値になっていることを確認する
#
#select * from T where f < 100;
#⇒ 期待結果:
#{90, 9, 900}
#{40, 4, 400}
#{50, 5, 500}
#{60, 6, 600}
#{70, 7, 700}
#{80, 8, 800}

Command "insert T values (90, 9, 900), (40, 4, 400), (50, 5, 500)";
Command "insert T values (60, 6, 600), (70, 7, 700), (80, 8, 800)";

Command "select * from T where f < 100";

#さらに g に値を指定しないで数件の挿入を数回繰り返す
#
#insert T(f, h) values (100, 1000), (200, 2000), (300, 3000);
#insert T(f, h) values (400, 4000), (500, 5000), (600, 6000);
#
#g の値がこれまでの最大値(9)の続きから始まることを確認する
#
#select * from T where f >= 100;
#⇒ 期待結果:
#{100, 10, 1000}
#{200, 11, 2000}
#{300, 12, 3000}
#{400, 13, 4000}
#{500, 14, 5000}
#{600, 15, 6000}

Command "insert T(f, h) values (100, 1000), (200, 2000), (300, 3000)";
Command "insert T(f, h) values (400, 4000), (500, 5000), (600, 6000)";

Command "select * from T where f >= 100";

######################################################################


######################################################################
#3-3 3-4の検査
#引き続いて g に値を指定しないで数件の更新を数回繰り返す
#
#update T set h = h + 1 where f between 40 and 50;
#update T set h = h * 2 where f between 60 and 90;
#
#g の値が変化していないことを確認する
#
#select * from T where f < 100;
#⇒ 期待結果:
#	{90, 9, 1800}
#	{40, 4, 401}
#	{50, 5, 501}
#	{60, 6, 1200}
#	{70, 7, 1400}
#	{80, 8, 1600}

Command "update T set h = h + 1 where f between 40 and 50";
Command "update T set h = h * 2 where f between 60 and 90";

Command "select * from T where f < 100";

#さらに g に現在値より小さい値を指定して数件の更新を数回繰り返す
#
#update T set g = g - 10 where f between 100 and 300;
#update T set g = g - 10 where f between 400 and 600;
#
#g の値が指定された値になっていることを確認する
#
#select * from T where f >= 100;
#⇒ 期待結果:
#	{100, 0, 1000}
#	{200, 1, 2000}
#	{300, 2, 3000}
#	{400, 3, 4000}
#	{500, 4, 5000}
#	{600, 5, 6000}
Command "select * from T ";

Command "update T set g = g - 10 where f between 100 and 300";
Command "update T set g = g - 10 where f between 400 and 600";

Command "select * from T where f >= 100";

#さらに g に値を指定しないで数件の挿入を数回繰り返す
#
#insert T(f, h) values (1, 10), (2, 20), (3, 30);
#insert T(f, h) values (4, 40), (5, 50), (6, 60);
#
#g の値がこれまでの最大値の続き(10) から始まることを確認する
#
#select * from T where f < 10;
#⇒ 期待結果:
#	{1, 10, 10}
#	{2, 11, 20}
#	{3, 12, 30}
#	{4, 13, 40}
#	{5, 14, 50}
#	{6, 15, 60}

Command "insert T(f, h) values (1, 10), (2, 20), (3, 30)";
Command "insert T(f, h) values (4, 40), (5, 50), (6, 60)";

Command "select * from T where f < 10";

#さらに g に現在値より大きい値を指定して数件の更新を数回繰り返す
#
#update T set g = g * 20 where f between 40 and 60;
#update T set g = g * 10 where f between 70 and 90;
#
#g の値が指定された値になっていることを確認する
#
#select * from T where f between 40 and 90;
#⇒ 期待結果:
#	{90, 90, 1800}
#	{40, 80, 401}
#	{50, 100, 501}
#	{60, 120, 1200}
#	{70, 70, 1400}
#	{80, 80, 1600}

Command "update T set g = g * 20 where f between 40 and 60";
Command "update T set g = g * 10 where f between 70 and 90";

Command "select * from T where f between 40 and 90";

#さらに g に値を指定しないで数件の挿入を数回繰り返す
#
#insert T(f, h) values (1000, 10000), (2000, 20000), (3000, 30000);
#insert T(f, h) values (4000, 40000), (5000, 50000), (6000, 60000);
#
#g の値がこれまでの最大値の続き(121) から始まることを確認する
#
#select * from T where f >= 1000;
#⇒ 期待結果:
#	{1000, 121, 10000}
#	{2000, 122, 20000}
#	{3000, 123, 30000}
#	{4000, 124, 40000}
#	{5000, 125, 50000}
#	{6000, 126, 60000}

Command "insert T(f, h) values (1000, 10000), (2000, 20000), (3000, 30000)";
Command "insert T(f, h) values (4000, 40000), (5000, 50000), (6000, 60000)";

Command "select * from T where f >= 1000";

######################################################################

# tableの後始末
Command "drop table T";

TerminateSession;

InitializeSession "";
Command "drop database TESTDB";
TerminateSession;
Terminate;
End;
