


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

InitializeSession "TESTDB";

######################################################################
#
#表を作り直す
#4-1の検査
#drop table T;
#create table T (f int, g int generated always 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 "create table T (f int, g int generated always as identity (get max), h int)";

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";

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


######################################################################
#4-2(登録済みから) 4-1(登録済みから)
#引き続いて g に値を指定して挿入を試みる
#
#insert T values (40, 4, 400);
#⇒ 期待結果:
#   エラー(SQLSyntaxError)
#
#さらに 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 values (40, 4, 400)";

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";

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


######################################################################
#4-2(初期状態から)
#表を作り直す
#
#drop table T;
#create table T (f int, g int generated always as identity (get max), h int);

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

#g に値を指定して挿入を試みる
#
#insert T values (40, 4, 400);
#⇒ 期待結果:
#3   エラー(SQLSyntaxError)

Command "insert T values (40, 4, 400)";

#さらに g に値を指定しないで数件の挿入を数回繰り返す
#
#insert T(f, h) values (100, 1000), (200, 2000), (300, 3000);
#insert T(f, h) values (400, 4000), (500, 5000), (600, 6000);
#
#g の値が 0 から始まることを確認する
#
#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 "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";

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


######################################################################
#4-3 4-4の検査
#引き続いて g に値を指定しないで数件の更新を数回繰り返す
#
#update T set h = h + 1 where f between 100 and 300;
#update T set h = h * 2 where f between 400 and 600;
#
#g の値が変化していないことを確認する
#
#select * from T where f < 100;
#⇒ 期待結果:
#	{100, 0, 1001}
#	{200, 1, 2001}
#	{300, 2, 3001}
#	{400, 3, 8000}
#	{500, 4, 10000}
#	{600, 5, 12000}

Command "update T set h = h + 1 where f between 100 and 300";
Command "update T set h = h * 2 where f between 400 and 600";

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

#さらに g に値を指定して更新を試みる
#
#update T set g = g + 100 where f between 100 and 300;
#⇒ 期待結果:
#   エラー(SQLSyntaxError)

Command "update T set g = g + 100 where f between 100 and 300";

#さらに g に値を指定しないで数件の挿入を数回繰り返す
#
#insert T(f, h) values (1, 10), (2, 20), (3, 30);
#insert T(f, h) values (4, 40), (5, 50), (6, 60);
#
#g の値が前回の続き(6) から始まることを確認する
#
#select * from T where f < 10;
#⇒ 期待結果:
#	{1, 6, 10}
#	{2, 7, 20}
#	{3, 8, 30}
#	{4, 9, 40}
#	{5, 10, 50}
#	{6, 11, 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";

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

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

TerminateSession;

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