-- sanity check of system catalog SELECT attrelid, attname, attidentity FROM pg_attribute WHERE attidentity NOTIN ('', 'a', 'd');
CREATETABLE itest1 (a int generated bydefaultas identity, b text); CREATETABLE itest2 (a bigint generated always as identity, b text); CREATETABLE itest3 (a smallint generated bydefaultas identity (start with7 increment by5), b text); ALTERTABLE itest3 ALTERCOLUMN a ADD GENERATED ALWAYS AS IDENTITY; -- error
SELECT table_name, column_name, column_default, is_nullable, is_identity, identity_generation, identity_start, identity_increment, identity_maximum, identity_minimum, identity_cycle FROM information_schema.columns WHERE table_name LIKE'itest_'ORDERBY1, 2;
-- internal sequences should not be shown here SELECT sequence_name FROM information_schema.sequences WHERE sequence_name LIKE'itest%';
SELECT pg_get_serial_sequence('itest1', 'a');
\d itest1_a_seq
CREATETABLE itest4 (a int, b text); ALTERTABLE itest4 ALTERCOLUMN a ADD GENERATED ALWAYS AS IDENTITY; -- error, requires NOT NULL ALTERTABLE itest4 ALTERCOLUMN a SETNOTNULL; ALTERTABLE itest4 ALTERCOLUMN c ADD GENERATED ALWAYS AS IDENTITY; -- error, column c does not exist ALTERTABLE itest4 ALTERCOLUMN a ADD GENERATED ALWAYS AS IDENTITY; -- ok ALTERTABLE itest4 ALTERCOLUMN a DROPNOTNULL; -- error, disallowed ALTERTABLE itest4 ALTERCOLUMN a ADD GENERATED ALWAYS AS IDENTITY; -- error, already set ALTERTABLE itest4 ALTERCOLUMN b ADD GENERATED ALWAYS AS IDENTITY; -- error, wrong data type
-- for later ALTERTABLE itest4 ALTERCOLUMN b SETDEFAULT'';
-- invalid column type CREATETABLE itest_err_1 (a text generated bydefaultas identity);
-- duplicate identity CREATETABLE itest_err_2 (a int generated always as identity generated bydefaultas identity);
-- cannot have default and identity CREATETABLE itest_err_3 (a intdefault5 generated bydefaultas identity);
-- cannot combine serial and identity CREATETABLE itest_err_4 (a serial generated bydefaultas identity);
SELECT * FROM itest1; SELECT * FROM itest2; SELECT * FROM itest3; SELECT * FROM itest4;
-- VALUES RTEs
CREATETABLE itest5 (a int generated always as identity, b text); INSERTINTO itest5 VALUES (1, 'a'); -- error INSERTINTO itest5 VALUES (DEFAULT, 'a'); -- ok INSERTINTO itest5 VALUES (2, 'b'), (3, 'c'); -- error INSERTINTO itest5 VALUES (DEFAULT, 'b'), (3, 'c'); -- error INSERTINTO itest5 VALUES (2, 'b'), (DEFAULT, 'c'); -- error INSERTINTO itest5 VALUES (DEFAULT, 'b'), (DEFAULT, 'c'); -- ok
INSERTINTO itest5 OVERRIDING SYSTEM VALUE VALUES (-1, 'aa'); INSERTINTO itest5 OVERRIDING SYSTEM VALUE VALUES (-2, 'bb'), (-3, 'cc'); INSERTINTO itest5 OVERRIDING SYSTEM VALUE VALUES (DEFAULT, 'dd'), (-4, 'ee'); INSERTINTO itest5 OVERRIDING SYSTEM VALUE VALUES (-5, 'ff'), (DEFAULT, 'gg'); INSERTINTO itest5 OVERRIDING SYSTEM VALUE VALUES (DEFAULT, 'hh'), (DEFAULT, 'ii');
INSERTINTO itest5 OVERRIDING USER VALUE VALUES (-1, 'aaa'); INSERTINTO itest5 OVERRIDING USER VALUE VALUES (-2, 'bbb'), (-3, 'ccc'); INSERTINTO itest5 OVERRIDING USER VALUE VALUES (DEFAULT, 'ddd'), (-4, 'eee'); INSERTINTO itest5 OVERRIDING USER VALUE VALUES (-5, 'fff'), (DEFAULT, 'ggg'); INSERTINTO itest5 OVERRIDING USER VALUE VALUES (DEFAULT, 'hhh'), (DEFAULT, 'iii');
-- This inserts the row as presented: INSERTINTO itest1 VALUES (10, 'xyz'); -- With GENERATED BY DEFAULT, OVERRIDING SYSTEM VALUE is not allowed -- by the standard, but we allow it as a no-op, since it is of use if -- there are multiple identity columns in a table, which is also an -- extension. INSERTINTO itest1 OVERRIDING SYSTEM VALUE VALUES (20, 'xyz'); -- This ignores the 30 and uses the sequence value instead: INSERTINTO itest1 OVERRIDING USER VALUE VALUES (30, 'xyz');
SELECT * FROM itest1;
-- GENERATED ALWAYS
-- This is an error: INSERTINTO itest2 VALUES (10, 'xyz'); -- This inserts the row as presented: INSERTINTO itest2 OVERRIDING SYSTEM VALUE VALUES (20, 'xyz'); -- This ignores the 30 and uses the sequence value instead: INSERTINTO itest2 OVERRIDING USER VALUE VALUES (30, 'xyz');
SELECT * FROM itest2;
-- UPDATE tests
-- GENERATED BY DEFAULT is not restricted. UPDATE itest1 SET a = 101WHERE a = 1; UPDATE itest1 SET a = DEFAULTWHERE a = 2; SELECT * FROM itest1;
-- GENERATED ALWAYS allows only DEFAULT. UPDATE itest2 SET a = 101WHERE a = 1; -- error UPDATE itest2 SET a = DEFAULTWHERE a = 2; -- ok SELECT * FROM itest2;
-- COPY tests
CREATETABLE itest9 (a int GENERATED ALWAYS AS IDENTITY, b text, c bigint);
COPY itest9 FROM stdin; 100 foo 200 101 bar 201
\.
COPY itest9 (b, c) FROM stdin;
foo2 202
bar2 203
\.
SELECT * FROM itest9 ORDERBY c;
-- DROP IDENTITY tests
ALTERTABLE itest4 ALTERCOLUMN a DROP IDENTITY; ALTERTABLE itest4 ALTERCOLUMN a DROP IDENTITY; -- error ALTERTABLE itest4 ALTERCOLUMN a DROP IDENTITY IFEXISTS; -- noop
INSERTINTO itest4 DEFAULTVALUES; -- fails because NOT NULL is not dropped ALTERTABLE itest4 ALTERCOLUMN a DROPNOTNULL; INSERTINTO itest4 DEFAULTVALUES; SELECT * FROM itest4;
-- check that sequence is removed SELECT sequence_name FROM itest4_a_seq;
-- test views
CREATETABLE itest10 (a int generated bydefaultas identity, b text); CREATETABLE itest11 (a int generated always as identity, b text);
CREATE VIEW itestv10 ASSELECT * FROM itest10; CREATE VIEW itestv11 ASSELECT * FROM itest11;
INSERTINTO itestv10 VALUES (10, 'xyz'); INSERTINTO itestv10 OVERRIDING USER VALUE VALUES (11, 'xyz');
SELECT * FROM itestv10;
INSERTINTO itestv11 VALUES (10, 'xyz'); INSERTINTO itestv11 OVERRIDING SYSTEM VALUE VALUES (11, 'xyz');
SELECT * FROM itestv11;
DROP VIEW itestv10, itestv11;
-- ADD COLUMN
CREATETABLE itest13 (a int); -- add column to empty table ALTERTABLE itest13 ADDCOLUMN b int GENERATED BYDEFAULTAS IDENTITY; INSERTINTO itest13 VALUES (1), (2), (3); -- add column to populated table ALTERTABLE itest13 ADDCOLUMN c int GENERATED BYDEFAULTAS IDENTITY; SELECT * FROM itest13;
-- various ALTER COLUMN tests
-- fail, not allowed for identity columns ALTERTABLE itest1 ALTERCOLUMN a SETDEFAULT1;
-- fail, not allowed, already has a default CREATETABLE itest5 (a serial, b text); ALTERTABLE itest5 ALTERCOLUMN a ADD GENERATED ALWAYS AS IDENTITY;
ALTERTABLE itest3 ALTERCOLUMN a TYPE int; SELECT seqtypid::regtype FROM pg_sequence WHERE seqrelid = 'itest3_a_seq'::regclass;
\d itest3
ALTERTABLE itest3 ALTERCOLUMN a TYPE text; -- error
-- check that unlogged propagates to sequence CREATE UNLOGGED TABLE itest17 (a intNOTNULL, b text); ALTERTABLE itest17 ALTERCOLUMN a ADD GENERATED ALWAYS AS IDENTITY; ALTERTABLE itest17 ADDCOLUMN c int GENERATED ALWAYS AS IDENTITY;
\d itest17
\d itest17_a_seq
\d itest17_c_seq CREATETABLE itest18 (a intNOTNULL, b text); ALTERTABLE itest18 SET UNLOGGED, ALTERCOLUMN a ADD GENERATED ALWAYS AS IDENTITY;
\d itest18
\d itest18_a_seq ALTERTABLE itest18 SET LOGGED;
\d itest18
\d itest18_a_seq ALTERTABLE itest18 SET UNLOGGED;
\d itest18
\d itest18_a_seq
-- kinda silly to change property in the same command, but it should work ALTERTABLE itest3 ADDCOLUMN c int GENERATED BYDEFAULTAS IDENTITY, ALTERCOLUMN c SET GENERATED ALWAYS;
\d itest3
-- ALTER COLUMN ... SET
CREATETABLE itest6 (a int GENERATED ALWAYS AS IDENTITY, b text); INSERTINTO itest6 DEFAULTVALUES;
ALTERTABLE itest6 ALTERCOLUMN a SET GENERATED BYDEFAULTSET INCREMENT BY2SET START WITH100 RESTART; INSERTINTO itest6 DEFAULTVALUES; INSERTINTO itest6 DEFAULTVALUES; SELECT * FROM itest6;
SELECT table_name, column_name, is_identity, identity_generation FROM information_schema.columns WHERE table_name = 'itest6'ORDERBY1, 2;
ALTERTABLE itest6 ALTERCOLUMN b SET INCREMENT BY2; -- fail, not identity
-- prohibited direct modification of sequence
ALTER SEQUENCE itest6_a_seq OWNED BY NONE;
-- inheritance
CREATETABLE itest7 (a int GENERATED ALWAYS AS IDENTITY); INSERTINTO itest7 DEFAULTVALUES; SELECT * FROM itest7;
-- identity property is not inherited CREATETABLE itest7a (b text) INHERITS (itest7);
-- make column identity in child table CREATETABLE itest7b (a int); CREATETABLE itest7c (a int GENERATED ALWAYS AS IDENTITY) INHERITS (itest7b); INSERTINTO itest7c DEFAULTVALUES; SELECT * FROM itest7c;
CREATETABLE itest7d (a intnotnull); CREATETABLE itest7e () INHERITS (itest7d); ALTERTABLE itest7d ALTERCOLUMN a ADD GENERATED ALWAYS AS IDENTITY; ALTERTABLE itest7d ADDCOLUMN b int GENERATED ALWAYS AS IDENTITY; -- error
SELECT table_name, column_name, is_nullable, is_identity, identity_generation FROM information_schema.columns WHERE table_name LIKE'itest7%'ORDERBY1, 2;
-- These ALTER TABLE variants will not recurse. ALTERTABLE itest7 ALTERCOLUMN a SET GENERATED BYDEFAULT; ALTERTABLE itest7 ALTERCOLUMN a RESTART; ALTERTABLE itest7 ALTERCOLUMN a DROP IDENTITY;
-- privileges CREATE USER regress_identity_user1; CREATETABLE itest8 (a int GENERATED ALWAYS AS IDENTITY, b text); GRANTSELECT, INSERTON itest8 TO regress_identity_user1; SET ROLE regress_identity_user1; INSERTINTO itest8 DEFAULTVALUES; SELECT * FROM itest8;
RESET ROLE; DROPTABLE itest8; DROP USER regress_identity_user1;
-- multiple steps in ALTER TABLE CREATETABLE itest8 (f1 int);
ALTERTABLE itest8 ADDCOLUMN f3 intNOTNULL, ALTERCOLUMN f3 ADD GENERATED ALWAYS AS IDENTITY, ALTERCOLUMN f3 SET GENERATED BYDEFAULTSET INCREMENT 10;
ALTERTABLE itest8 ADDCOLUMN f4 int;
ALTERTABLE itest8 ALTERCOLUMN f4 SETNOTNULL, ALTERCOLUMN f4 ADD GENERATED ALWAYS AS IDENTITY, ALTERCOLUMN f4 SET DATA TYPE bigint;
ALTERTABLE itest8 ADDCOLUMN f5 int GENERATED ALWAYS AS IDENTITY;
ALTERTABLE itest8 ALTERCOLUMN f5 DROP IDENTITY, ALTERCOLUMN f5 DROPNOTNULL, ALTERCOLUMN f5 SET DATA TYPE bigint;
INSERTINTO itest8 VALUES(0), (1);
-- This does not work when the table isn't empty. That's intentional, -- since ADD GENERATED should only affect later insertions: ALTERTABLE itest8 ADDCOLUMN f22 intNOTNULL, ALTERCOLUMN f22 ADD GENERATED ALWAYS AS IDENTITY;
CREATE TYPE itest_type AS (f1 integer, f2 text, f3 bigint); CREATETABLE itest12 OF itest_type (f1 WITH OPTIONS GENERATED ALWAYS AS IDENTITY); -- error DROP TYPE itest_type CASCADE;
-- table partitions
-- partitions inherit identity column and share sequence CREATETABLE pitest1 (f1 date NOTNULL, f2 text, f3 bigint generated always as identity) PARTITION BY RANGE (f1); -- new partition CREATETABLE pitest1_p1 PARTITION OF pitest1 FORVALUESFROM ('2016-07-01') TO ('2016-08-01'); INSERTinto pitest1(f1, f2) VALUES ('2016-07-2', 'from pitest1'); INSERTinto pitest1_p1 (f1, f2) VALUES ('2016-07-3', 'from pitest1_p1'); -- attached partition CREATETABLE pitest1_p2 (f3 bigint, f2 text, f1 date NOTNULL); INSERTINTO pitest1_p2 (f1, f2, f3) VALUES ('2016-08-2', 'before attaching', 100); ALTERTABLE pitest1 ATTACH PARTITION pitest1_p2 FORVALUESFROM ('2016-08-01') TO ('2016-09-01'); -- requires NOT NULL constraint ALTERTABLE pitest1_p2 ALTERCOLUMN f3 SETNOTNULL; ALTERTABLE pitest1 ATTACH PARTITION pitest1_p2 FORVALUESFROM ('2016-08-01') TO ('2016-09-01'); INSERTINTO pitest1_p2 (f1, f2) VALUES ('2016-08-3', 'from pitest1_p2'); INSERTINTO pitest1 (f1, f2) VALUES ('2016-08-4', 'from pitest1'); -- LIKE INCLUDING on partition CREATETABLE pitest1_p1_like (LIKE pitest1_p1 INCLUDING IDENTITY); INSERTinto pitest1_p1_like(f1, f2) VALUES ('2016-07-2', 'from pitest1_p1_like'); SELECT tableoid::regclass, f1, f2, f3 FROM pitest1; SELECT tableoid::regclass, f1, f2, f3 FROM pitest1_p1_like; ALTERTABLE pitest1 ALTERCOLUMN f3 SET DATA TYPE bigint; SELECT tableoid::regclass, f1, f2, f3, pg_typeof(f3) FROM pitest1; SELECT tableoid::regclass, f1, f2, f3, pg_typeof(f3) FROM pitest1_p2;
-- add identity column CREATETABLE pitest2 (f1 date NOTNULL, f2 text) PARTITION BY RANGE (f1); CREATETABLE pitest2_p1 PARTITION OF pitest2 FORVALUESFROM ('2016-07-01') TO ('2016-08-01'); CREATETABLE pitest2_p2 PARTITION OF pitest2 FORVALUESFROM ('2016-08-01') TO ('2016-09-01'); INSERTinto pitest2(f1, f2) VALUES ('2016-07-2', 'from pitest2'); INSERTINTO pitest2 (f1, f2) VALUES ('2016-08-2', 'from pitest2'); ALTERTABLE pitest2 ADDCOLUMN f3 int GENERATED ALWAYS AS IDENTITY; INSERTinto pitest2_p1 (f1, f2) VALUES ('2016-07-3', 'from pitest2_p1'); INSERTINTO pitest2_p2 (f1, f2) VALUES ('2016-08-3', 'from pitest2_p2'); INSERTinto pitest2(f1, f2) VALUES ('2016-07-4', 'from pitest2'); INSERTINTO pitest2 (f1, f2) VALUES ('2016-08-4', 'from pitest2'); SELECT tableoid::regclass, f1, f2, f3 FROM pitest2;
-- changing a regular column to identity column in a partitioned table CREATETABLE pitest3 (f1 date NOTNULL, f2 text, f3 int) PARTITION BY RANGE (f1); CREATETABLE pitest3_p1 PARTITION OF pitest3 FORVALUESFROM ('2016-07-01') TO ('2016-08-01'); INSERTinto pitest3 VALUES ('2016-07-2', 'from pitest3', 1); INSERTinto pitest3_p1 VALUES ('2016-07-3', 'from pitest3_p1', 2); -- fails, changing only a partition not allowed ALTERTABLE pitest3_p1 ALTERCOLUMN f3 SETNOTNULL, ALTERCOLUMN f3 ADD GENERATED ALWAYS AS IDENTITY (START WITH3); -- fails, changing only the partitioned table not allowed
BEGIN; ALTERTABLE pitest3_p1 ALTERCOLUMN f3 SETNOTNULL; ALTERTABLE ONLY pitest3 ALTERCOLUMN f3 ADD GENERATED ALWAYS AS IDENTITY (START WITH3);
ROLLBACK; ALTERTABLE pitest3 ALTERCOLUMN f3 SETNOTNULL, ALTERCOLUMN f3 ADD GENERATED ALWAYS AS IDENTITY (START WITH3); INSERTinto pitest3(f1, f2) VALUES ('2016-07-4', 'from pitest3'); INSERTinto pitest3_p1 (f1, f2) VALUES ('2016-07-5', 'from pitest3_p1'); SELECT tableoid::regclass, f1, f2, f3 FROM pitest3;
-- changing an identity column to a non-identity column in a partitioned table ALTERTABLE pitest3_p1 ALTERCOLUMN f3 DROP IDENTITY; -- fails ALTERTABLE ONLY pitest3 ALTERCOLUMN f3 DROP IDENTITY; -- fails ALTERTABLE pitest3 ALTERCOLUMN f3 DROP IDENTITY; INSERTinto pitest3(f1, f2) VALUES ('2016-07-4', 'from pitest3'); -- fails INSERTinto pitest3_p1 (f1, f2) VALUES ('2016-07-5', 'from pitest3_p1'); -- fails INSERTinto pitest3(f1, f2, f3) VALUES ('2016-07-6', 'from pitest3', 5); INSERTinto pitest3_p1 (f1, f2, f3) VALUES ('2016-07-7', 'from pitest3_p1', 6); SELECT tableoid::regclass, f1, f2, f3 FROM pitest3;
-- Changing NOT NULL constraint of identity columns is not allowed ALTERTABLE pitest1_p1 ALTERCOLUMN f3 DROPNOTNULL; ALTERTABLE pitest1 ALTERCOLUMN f3 DROPNOTNULL; -- Identity columns have their own default ALTERTABLE pitest1_p2 ALTERCOLUMN f3 SETDEFAULT10000; ALTERTABLE pitest1 ALTERCOLUMN f3 SETDEFAULT10000; -- Adding identity to an identity column is not allowed ALTERTABLE pitest1_p2 ALTERCOLUMN f3 ADD GENERATED BYDEFAULTAS IDENTITY; ALTERTABLE pitest1 ALTERCOLUMN f3 ADD GENERATED BYDEFAULTAS IDENTITY;
-- partitions with their own identity columns are not allowed, even if the -- partitioned table does not have an identity column. CREATETABLE pitest1_pfail PARTITION OF pitest1 (
f3 WITH OPTIONS GENERATED ALWAYS AS IDENTITY
) FORVALUESFROM ('2016-11-01') TO ('2016-12-01');
CREATETABLE pitest_pfail PARTITION OF pitest3 (
f3 WITH OPTIONS GENERATED ALWAYS AS IDENTITY
) FORVALUESFROM ('2016-07-01') TO ('2016-08-01');
CREATETABLE pitest1_pfail (f1 date NOTNULL, f2 text, f3 bigint GENERATED ALWAYS AS IDENTITY); ALTERTABLE pitest1 ATTACH PARTITION pitest1_pfail FORVALUESFROM ('2016-11-01') TO ('2016-12-01'); ALTERTABLE pitest3 ATTACH PARTITION pitest1_pfail FORVALUESFROM ('2016-11-01') TO ('2016-12-01');
DROPTABLE pitest1_pfail; DROPTABLE pitest3;
-- test that sequence of half-dropped serial column is properly ignored
CREATETABLE itest14 (id serial); ALTERTABLE itest14 ALTER id DROPDEFAULT; ALTERTABLE itest14 ALTER id ADD GENERATED BYDEFAULTAS IDENTITY; INSERTINTO itest14 (id) VALUES (DEFAULT);
-- Identity columns must be NOT NULL (cf bug #16913)
CREATETABLE itest15 (id integer GENERATED ALWAYS AS IDENTITY NULL); -- fail CREATETABLE itest15 (id integerNULL GENERATED ALWAYS AS IDENTITY); -- fail CREATETABLE itest15 (id integer GENERATED ALWAYS AS IDENTITY NOTNULL); DROPTABLE itest15; CREATETABLE itest15 (id integerNOTNULL GENERATED ALWAYS AS IDENTITY); DROPTABLE itest15;
-- MERGE tests CREATETABLE itest15 (a int GENERATED ALWAYS AS IDENTITY, b text); CREATETABLE itest16 (a int GENERATED BYDEFAULTAS IDENTITY, b text);
MERGE INTO itest15 t USING (SELECT10AS s_a, 'inserted by merge'AS s_b) s ON t.a = s.s_a WHENNOT MATCHED THEN INSERT (a, b) VALUES (s.s_a, s.s_b);
-- Used to fail, but now it works and ignores the user supplied value
MERGE INTO itest15 t USING (SELECT20AS s_a, 'inserted by merge'AS s_b) s ON t.a = s.s_a WHENNOT MATCHED THEN INSERT (a, b) OVERRIDING USER VALUE VALUES (s.s_a, s.s_b);
MERGE INTO itest15 t USING (SELECT30AS s_a, 'inserted by merge'AS s_b) s ON t.a = s.s_a WHENNOT MATCHED THEN INSERT (a, b) OVERRIDING SYSTEM VALUE VALUES (s.s_a, s.s_b);
MERGE INTO itest16 t USING (SELECT10AS s_a, 'inserted by merge'AS s_b) s ON t.a = s.s_a WHENNOT MATCHED THEN INSERT (a, b) VALUES (s.s_a, s.s_b);
MERGE INTO itest16 t USING (SELECT20AS s_a, 'inserted by merge'AS s_b) s ON t.a = s.s_a WHENNOT MATCHED THEN INSERT (a, b) OVERRIDING USER VALUE VALUES (s.s_a, s.s_b);
MERGE INTO itest16 t USING (SELECT30AS s_a, 'inserted by merge'AS s_b) s ON t.a = s.s_a WHENNOT MATCHED THEN INSERT (a, b) OVERRIDING SYSTEM VALUE VALUES (s.s_a, s.s_b);
SELECT * FROM itest15; SELECT * FROM itest16; DROPTABLE itest15; DROPTABLE itest16;
-- For testing of pg_dump and pg_upgrade, leave behind some identity -- sequences whose logged-ness doesn't match their owning table's. CREATETABLE identity_dump_logged (a INT GENERATED ALWAYS AS IDENTITY); ALTER SEQUENCE identity_dump_logged_a_seq SET UNLOGGED; CREATE UNLOGGED TABLE identity_dump_unlogged (a INT GENERATED ALWAYS AS IDENTITY); ALTER SEQUENCE identity_dump_unlogged_a_seq SET LOGGED; SELECT relname, relpersistence FROM pg_class WHERE relname ~ '^identity_dump_'ORDERBY1;
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.16 Sekunden
(vorverarbeitet am 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.