-- -- CREATE_VIEW -- Virtual class definitions -- (this also tests the query rewrite system) --
-- directory paths and dlsuffix are passed to us in environment variables
\getenv abs_srcdir PG_ABS_SRCDIR
\getenv libdir PG_LIBDIR
\getenv dlsuffix PG_DLSUFFIX
\set regresslib :libdir '/regress' :dlsuffix
CREATE FUNCTION interpt_pp(path, path)
RETURNS point AS :'regresslib'
LANGUAGE C STRICT;
CREATETABLE real_city (
pop int4,
cname text,
outline path
);
\set filename :abs_srcdir '/data/real_city.data'
COPY real_city FROM :'filename'; ANALYZE real_city;
SELECT * INTOTABLE ramp FROM ONLY road WHERE name ~ '.*Ramp';
CREATE VIEW street AS SELECT r.name, r.thepath, c.cname AS cname FROM ONLY road r, real_city c WHERE c.outline ?# r.thepath;
CREATE VIEW iexit AS SELECT ih.name, ih.thepath,
interpt_pp(ih.thepath, r.thepath) ASexit FROM ihighway ih, ramp r WHERE ih.thepath ?# r.thepath;
CREATE VIEW toyemp AS SELECT name, age, location, 12*salary AS annualsal FROM emp;
-- Test comments
COMMENT ON VIEW noview IS'no view';
COMMENT ON VIEW toyemp IS'is a view';
COMMENT ON VIEW toyemp ISNULL;
-- These views are left around mainly to exercise special cases in pg_dump.
CREATETABLE view_base_table (keyintPRIMARYKEY, data varchar(20));
CREATE VIEW key_dependent_view AS SELECT * FROM view_base_table GROUPBYkey;
CREATEORREPLACE VIEW viewtest AS SELECT * FROM viewtest_tbl;
CREATEORREPLACE VIEW viewtest AS SELECT * FROM viewtest_tbl WHERE a > 10;
SELECT * FROM viewtest;
CREATEORREPLACE VIEW viewtest AS SELECT a, b, c, d FROM viewtest_tbl WHERE a > 5ORDERBY b DESC;
SELECT * FROM viewtest;
-- should fail CREATEORREPLACE VIEW viewtest AS SELECT a FROM viewtest_tbl WHERE a <> 20;
-- should fail CREATEORREPLACE VIEW viewtest AS SELECT1, * FROM viewtest_tbl;
-- should fail CREATEORREPLACE VIEW viewtest AS SELECT a, b::numeric, c, d FROM viewtest_tbl;
-- should fail CREATEORREPLACE VIEW viewtest AS SELECT a, b, c::numeric(10,2), d FROM viewtest_tbl;
-- should fail CREATEORREPLACE VIEW viewtest AS SELECT a, b, c, d COLLATE"POSIX"FROM viewtest_tbl;
-- should work CREATEORREPLACE VIEW viewtest AS SELECT a, b, c, d, 0AS e FROM viewtest_tbl;
DROP VIEW viewtest; DROPTABLE viewtest_tbl;
-- tests for temporary views
CREATESCHEMA temp_view_test CREATETABLE base_table (a int, id int) CREATETABLE base_table2 (a int, id int);
SET search_path TO temp_view_test, public;
CREATE TEMPORARY TABLE temp_table (a int, id int);
-- should be created in temp_view_test schema CREATE VIEW v1 ASSELECT * FROM base_table; -- should be created in temp object schema CREATE VIEW v1_temp ASSELECT * FROM temp_table; -- should be created in temp object schema CREATE TEMP VIEW v2_temp ASSELECT * FROM base_table; -- should be created in temp_views schema CREATE VIEW temp_view_test.v2 ASSELECT * FROM base_table; -- should fail CREATE VIEW temp_view_test.v3_temp ASSELECT * FROM temp_table; -- should fail CREATESCHEMA test_view_schema CREATE TEMP VIEW testview ASSELECT1;
-- joins: if any of the join relations are temporary, the view -- should also be temporary
-- should be non-temp CREATE VIEW v3 AS SELECT t1.a AS t1_a, t2.a AS t2_a FROM base_table t1, base_table2 t2 WHERE t1.id = t2.id; -- should be temp (one join rel is temp) CREATE VIEW v4_temp AS SELECT t1.a AS t1_a, t2.a AS t2_a FROM base_table t1, temp_table t2 WHERE t1.id = t2.id; -- should be temp CREATE VIEW v5_temp AS SELECT t1.a AS t1_a, t2.a AS t2_a, t3.a AS t3_a FROM base_table t1, base_table2 t2, temp_table t3 WHERE t1.id = t2.id and t2.id = t3.id;
-- subqueries CREATE VIEW v4 ASSELECT * FROM base_table WHERE id IN (SELECT id FROM base_table2); CREATE VIEW v5 ASSELECT t1.id, t2.a FROM base_table t1, (SELECT * FROM base_table2) t2; CREATE VIEW v6 ASSELECT * FROM base_table WHEREEXISTS (SELECT1FROM base_table2); CREATE VIEW v7 ASSELECT * FROM base_table WHERENOTEXISTS (SELECT1FROM base_table2); CREATE VIEW v8 ASSELECT * FROM base_table WHEREEXISTS (SELECT1);
CREATE VIEW v6_temp ASSELECT * FROM base_table WHERE id IN (SELECT id FROM temp_table); CREATE VIEW v7_temp ASSELECT t1.id, t2.a FROM base_table t1, (SELECT * FROM temp_table) t2; CREATE VIEW v8_temp ASSELECT * FROM base_table WHEREEXISTS (SELECT1FROM temp_table); CREATE VIEW v9_temp ASSELECT * FROM base_table WHERENOTEXISTS (SELECT1FROM temp_table);
-- a view should also be temporary if it references a temporary view CREATE VIEW v10_temp ASSELECT * FROM v7_temp; CREATE VIEW v11_temp ASSELECT t1.id, t2.a FROM base_table t1, v10_temp t2; CREATE VIEW v12_temp ASSELECTtrueFROM v11_temp;
-- a view should also be temporary if it references a temporary sequence CREATE SEQUENCE seq1; CREATE TEMPORARY SEQUENCE seq1_temp; CREATE VIEW v9 ASSELECT seq1.is_called FROM seq1; CREATE VIEW v13_temp ASSELECT seq1_temp.is_called FROM seq1_temp;
SELECT relname FROM pg_class WHERE relname LIKE'v_' AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'temp_view_test') ORDERBY relname; SELECT relname FROM pg_class WHERE relname LIKE'v%' AND relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname LIKE'pg_temp%') ORDERBY relname;
CREATESCHEMA testviewschm2; SET search_path TO testviewschm2, public;
CREATETABLE t1 (num int, name text); CREATETABLE t2 (num2 int, value text); CREATE TEMP TABLE tt (num2 int, value text);
CREATE VIEW nontemp1 ASSELECT * FROM t1 CROSSJOIN t2; CREATE VIEW temporal1 ASSELECT * FROM t1 CROSSJOIN tt; CREATE VIEW nontemp2 ASSELECT * FROM t1 INNERJOIN t2 ON t1.num = t2.num2; CREATE VIEW temporal2 ASSELECT * FROM t1 INNERJOIN tt ON t1.num = tt.num2; CREATE VIEW nontemp3 ASSELECT * FROM t1 LEFTJOIN t2 ON t1.num = t2.num2; CREATE VIEW temporal3 ASSELECT * FROM t1 LEFTJOIN tt ON t1.num = tt.num2; CREATE VIEW nontemp4 ASSELECT * FROM t1 LEFTJOIN t2 ON t1.num = t2.num2 AND t2.value = 'xxx'; CREATE VIEW temporal4 ASSELECT * FROM t1 LEFTJOIN tt ON t1.num = tt.num2 AND tt.value = 'xxx';
SELECT relname FROM pg_class WHERE relname LIKE'nontemp%' AND relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'testviewschm2') ORDERBY relname; SELECT relname FROM pg_class WHERE relname LIKE'temporal%' AND relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname LIKE'pg_temp%') ORDERBY relname;
CREATETABLE tbl1 ( a int, b int); CREATETABLE tbl2 (c int, d int); CREATETABLE tbl3 (e int, f int); CREATETABLE tbl4 (g int, h int); CREATE TEMP TABLE tmptbl (i int, j int);
--Should be in testviewschm2 CREATE VIEW pubview ASSELECT * FROM tbl1 WHERE tbl1.a BETWEEN (SELECT d FROM tbl2 WHERE c = 1) AND (SELECT e FROM tbl3 WHERE f = 2) ANDEXISTS (SELECT g FROM tbl4 LEFTJOIN tbl3 ON tbl4.h = tbl3.f);
SELECT count(*) FROM pg_class where relname = 'pubview' AND relnamespace IN (SELECT OID FROM pg_namespace WHERE nspname = 'testviewschm2');
--Should be in temp object schema CREATE VIEW mytempview ASSELECT * FROM tbl1 WHERE tbl1.a BETWEEN (SELECT d FROM tbl2 WHERE c = 1) AND (SELECT e FROM tbl3 WHERE f = 2) ANDEXISTS (SELECT g FROM tbl4 LEFTJOIN tbl3 ON tbl4.h = tbl3.f) ANDNOTEXISTS (SELECT g FROM tbl4 LEFTJOIN tmptbl ON tbl4.h = tmptbl.j);
SELECT count(*) FROM pg_class where relname LIKE'mytempview' And relnamespace IN (SELECT OID FROM pg_namespace WHERE nspname LIKE'pg_temp%');
-- -- CREATE VIEW and WITH(...) clause -- CREATE VIEW mysecview1 ASSELECT * FROM tbl1 WHERE a = 0; CREATE VIEW mysecview2 WITH (security_barrier=true) ASSELECT * FROM tbl1 WHERE a > 0; CREATE VIEW mysecview3 WITH (security_barrier=false) ASSELECT * FROM tbl1 WHERE a < 0; CREATE VIEW mysecview4 WITH (security_barrier) ASSELECT * FROM tbl1 WHERE a <> 0; CREATE VIEW mysecview5 WITH (security_barrier=100) -- Error ASSELECT * FROM tbl1 WHERE a > 100; CREATE VIEW mysecview6 WITH (invalid_option) -- Error ASSELECT * FROM tbl1 WHERE a < 100; CREATE VIEW mysecview7 WITH (security_invoker=true) ASSELECT * FROM tbl1 WHERE a = 100; CREATE VIEW mysecview8 WITH (security_invoker=false, security_barrier=true) ASSELECT * FROM tbl1 WHERE a > 100; CREATE VIEW mysecview9 WITH (security_invoker) ASSELECT * FROM tbl1 WHERE a < 100; CREATE VIEW mysecview10 WITH (security_invoker=100) -- Error ASSELECT * FROM tbl1 WHERE a <> 100; SELECT relname, relkind, reloptions FROM pg_class WHERE oid in ('mysecview1'::regclass, 'mysecview2'::regclass, 'mysecview3'::regclass, 'mysecview4'::regclass, 'mysecview7'::regclass, 'mysecview8'::regclass, 'mysecview9'::regclass) ORDERBY relname;
CREATEORREPLACE VIEW mysecview1 ASSELECT * FROM tbl1 WHERE a = 256; CREATEORREPLACE VIEW mysecview2 ASSELECT * FROM tbl1 WHERE a > 256; CREATEORREPLACE VIEW mysecview3 WITH (security_barrier=true) ASSELECT * FROM tbl1 WHERE a < 256; CREATEORREPLACE VIEW mysecview4 WITH (security_barrier=false) ASSELECT * FROM tbl1 WHERE a <> 256; CREATEORREPLACE VIEW mysecview7 ASSELECT * FROM tbl1 WHERE a > 256; CREATEORREPLACE VIEW mysecview8 WITH (security_invoker=true) ASSELECT * FROM tbl1 WHERE a < 256; CREATEORREPLACE VIEW mysecview9 WITH (security_invoker=false, security_barrier=true) ASSELECT * FROM tbl1 WHERE a <> 256; SELECT relname, relkind, reloptions FROM pg_class WHERE oid in ('mysecview1'::regclass, 'mysecview2'::regclass, 'mysecview3'::regclass, 'mysecview4'::regclass, 'mysecview7'::regclass, 'mysecview8'::regclass, 'mysecview9'::regclass) ORDERBY relname;
-- Check that unknown literals are converted to "text" in CREATE VIEW, -- so that we don't end up with unknown-type columns.
CREATE VIEW unspecified_types AS SELECT42as i, 42.5as num, 'foo'as u, 'foo'::unknown as u2, nullas n;
\d+ unspecified_types SELECT * FROM unspecified_types;
-- This test checks that proper typmods are assigned in a multi-row VALUES
CREATE VIEW tt1 AS SELECT * FROM ( VALUES
('abc'::varchar(3), '0123456789', 42, 'abcd'::varchar(4)),
('0123456789', 'abc'::varchar(3), 42.12, 'abc'::varchar(4))
) vv(a,b,c,d);
\d+ tt1 SELECT * FROM tt1; SELECT a::varchar(3) FROM tt1; DROP VIEW tt1;
-- Test view decompilation in the face of relation renaming conflicts
-- Test correct deparsing of ORDER BY when there is an output name conflict
create view aliased_order_by as select x1 as x2, x2 as x1, x3 from tt1 orderby x2; -- this is interpreted per SQL92, so really ordering by x1
\d+ aliased_order_by
alter view aliased_order_by renamecolumn x1 to x0;
\d+ aliased_order_by
alter view aliased_order_by renamecolumn x3 to x1;
\d+ aliased_order_by
-- Test aliasing of joins
create view view_of_joins as select * from
(select * from (tbl1 crossjoin tbl2) same) ss,
(tbl3 crossjoin tbl4) same;
\d+ view_of_joins
createtable tbl1a (a int, c int); create view view_of_joins_2a asselect * from tbl1 join tbl1a using (a); create view view_of_joins_2b asselect * from tbl1 join tbl1a using (a) as x; create view view_of_joins_2c asselect * from (tbl1 join tbl1a using (a)) as y; create view view_of_joins_2d asselect * from (tbl1 join tbl1a using (a) as x) as y;
createtable tt5 (a int, b int); createtable tt6 (c int, d int); create view vv1 asselect * from (tt5 crossjoin tt6) j(aa,bb,cc,dd); select pg_get_viewdef('vv1', true); altertable tt5 addcolumn c int; select pg_get_viewdef('vv1', true); altertable tt5 addcolumn cc int; select pg_get_viewdef('vv1', true); altertable tt5 dropcolumn c; select pg_get_viewdef('vv1', true);
create view v4 asselect * from v1; alter view v1 renamecolumn a to x; select pg_get_viewdef('v1', true); select pg_get_viewdef('v4', true);
-- Unnamed FULL JOIN USING is lots of fun too
createtable tt7 (x int, xx int, y int); altertable tt7 dropcolumn xx; createtable tt8 (x int, z int);
create view vv2 as select * from (values(1,2,3,4,5)) v(a,b,c,d,e) unionall select * from tt7 full join tt8 using (x), tt8 tt8x;
select pg_get_viewdef('vv2', true);
create view vv3 as select * from (values(1,2,3,4,5,6)) v(a,b,c,x,e,f) unionall select * from
tt7 full join tt8 using (x),
tt7 tt7x full join tt8 tt8x using (x);
select pg_get_viewdef('vv3', true);
create view vv4 as select * from (values(1,2,3,4,5,6,7)) v(a,b,c,x,e,f,g) unionall select * from
tt7 full join tt8 using (x),
tt7 tt7x full join tt8 tt8x using (x) full join tt8 tt8y using (x);
create function tt14f() returns setof tt14t as
$$ declare
rec1 record;
begin for rec1 inselect * from tt14t loop return next rec1;
end loop;
end;
$$
language plpgsql;
create view tt14v asselect t.* from tt14f() t;
select pg_get_viewdef('tt14v', true); select * from tt14v;
altertable tt14t dropcolumn f3; -- fail, view has explicit reference to f3
-- We used to have a bug that would allow the above to succeed, posing -- hazards for later execution of the view. Check that the internal -- defenses for those hazards haven't bit-rotted, in case some other -- bug with similar symptoms emerges.
begin;
-- destroy the dependency entry that prevents the DROP: deletefrom pg_depend where
objid = (select oid from pg_rewrite where ev_class = 'tt14v'::regclass and rulename = '_RETURN') and refobjsubid = 3
returning pg_describe_object(classid, objid, objsubid) as obj,
pg_describe_object(refclassid, refobjid, refobjsubid) as ref,
deptype;
-- this will now succeed: altertable tt14t dropcolumn f3;
-- column f3 is still in the view, sort of ... select pg_get_viewdef('tt14v', true); -- ... and you can even EXPLAIN it ... explain (verbose, costs off) select * from tt14v; -- but it will fail at execution select f1, f4 from tt14v; select * from tt14v;
rollback;
-- likewise, altering a referenced column's type is prohibited ... altertable tt14t altercolumn f4 type integerusing f4::integer; -- fail
-- ... but some bug might let it happen, so check defenses
begin;
-- destroy the dependency entry that prevents the ALTER: deletefrom pg_depend where
objid = (select oid from pg_rewrite where ev_class = 'tt14v'::regclass and rulename = '_RETURN') and refobjsubid = 4
returning pg_describe_object(classid, objid, objsubid) as obj,
pg_describe_object(refclassid, refobjid, refobjsubid) as ref,
deptype;
-- this will now succeed: altertable tt14t altercolumn f4 type integerusing f4::integer;
-- f4 is still in the view ... select pg_get_viewdef('tt14v', true); -- but will fail at execution select f1, f3 from tt14v; select * from tt14v;
rollback;
drop view tt14v;
create view tt14v asselect t.f1, t.f4 from tt14f() t;
select pg_get_viewdef('tt14v', true); select * from tt14v;
altertable tt14t dropcolumn f3; -- ok
select pg_get_viewdef('tt14v', true); explain (verbose, costs off) select * from tt14v; select * from tt14v;
-- check display of whole-row variables in some corner cases
create type nestedcomposite as (x int8_tbl); create view tt15v asselect row(i)::nestedcomposite from int8_tbl i; select * from tt15v; select pg_get_viewdef('tt15v', true); select row(i.*::int8_tbl)::nestedcomposite from int8_tbl i;
create view tt16v asselect * from int8_tbl i, lateral(values(i)) ss; select * from tt16v; select pg_get_viewdef('tt16v', true); select * from int8_tbl i, lateral(values(i.*::int8_tbl)) ss;
create view tt17v asselect * from int8_tbl i where i in (values(i)); select * from tt17v; select pg_get_viewdef('tt17v', true); select * from int8_tbl i where i.* in (values(i.*::int8_tbl));
createtable tt15v_log(o tt15v, n tt15v, incr bool); create rule updlog asonupdateto tt15v do also insertinto tt15v_log values(old, new, row(old,old) < row(new,new));
\d+ tt15v
-- check unique-ification of overlength names
create view tt18v as select * from int8_tbl xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy unionall select * from int8_tbl xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz; select pg_get_viewdef('tt18v', true); explain (costs off) select * from tt18v;
-- check display of ScalarArrayOp with a sub-select
-- check display of assorted RTE_FUNCTION expressions
create view tt20v as select * from
coalesce(1,2) as c,
collation for ('x'::text) col, current_dateas d, localtimestamp(3) as t,
cast(1+2asint4) as i4,
cast(1+2asint8) as i8; select pg_get_viewdef('tt20v', true);
-- reverse-listing of various special function syntaxes required by SQL
create view tt201v as select
('2022-12-01'::date + '1 day'::interval) at time zone 'UTC'as atz,
extract(day from now()) as extr,
(now(), '1 day'::interval) overlaps
(current_timestamp(2), '1 day'::interval) as o, 'foo'is normalized isn, 'foo'is nfkc normalized isnn,
normalize('foo') as n,
normalize('foo', nfkd) as nfkd,
overlay('foo' placing 'bar'from2) as ovl,
overlay('foo' placing 'bar'from2for3) as ovl2,
position('foo'in'foobar') as p,
substring('foo'from2for3) as s,
substring('foo' similar 'f' escape '#') as ss,
substring('foo'from'oo') as ssf, -- historically-permitted abuse
trim(' 'from' foo ') as bt,
trim(leading' 'from' foo ') as lt,
trim(trailing' foo ') as rt,
trim(E'\\000'::bytea from E'\\000Tom\\000'::bytea) as btb,
trim(leading E'\\000'::bytea from E'\\000Tom\\000'::bytea) as ltb,
trim(trailing E'\\000'::bytea from E'\\000Tom\\000'::bytea) as rtb, CURRENT_DATEas cd,
(select * fromCURRENT_DATE) as cd2, CURRENT_TIMEas ct,
(select * fromCURRENT_TIME) as ct2, CURRENT_TIME (1) as ct3,
(select * fromCURRENT_TIME (1)) as ct4, CURRENT_TIMESTAMPas ct5,
(select * fromCURRENT_TIMESTAMP) as ct6, CURRENT_TIMESTAMP (1) as ct7,
(select * fromCURRENT_TIMESTAMP (1)) as ct8, LOCALTIMEas lt1,
(select * fromLOCALTIME) as lt2, LOCALTIME (1) as lt3,
(select * fromLOCALTIME (1)) as lt4, LOCALTIMESTAMPas lt5,
(select * fromLOCALTIMESTAMP) as lt6, LOCALTIMESTAMP (1) as lt7,
(select * fromLOCALTIMESTAMP (1)) as lt8,
CURRENT_CATALOG as ca,
(select * from CURRENT_CATALOG) as ca2,
CURRENT_ROLE as cr,
(select * from CURRENT_ROLE) as cr2,
CURRENT_SCHEMA as cs,
(select * from CURRENT_SCHEMA) as cs2, CURRENT_USERas cu,
(select * fromCURRENT_USER) as cu2,
USER as us,
(select * from USER) as us2,
SESSION_USER seu,
(select * from SESSION_USER) as seu2,
SYSTEM_USER as su,
(select * from SYSTEM_USER) as su2; select pg_get_viewdef('tt201v', true);
-- corner cases with empty join conditions
create view tt21v as select * from tt5 naturalinnerjoin tt6; select pg_get_viewdef('tt21v', true);
create view tt22v as select * from tt5 naturalleftjoin tt6; select pg_get_viewdef('tt22v', true);
-- check handling of views with immediately-renamed columns
create view tt23v (col_a, col_b) as select q1 as other_name1, q2 as other_name2 from int8_tbl union select42, 43;
select pg_get_viewdef('tt23v', true); select pg_get_ruledef(oid, true) from pg_rewrite where ev_class = 'tt23v'::regclass and ev_type = '1';
-- test extraction of FieldSelect field names (get_name_for_var_field)
create view tt24v as with cte as materialized (select r from (values(1,2),(3,4)) r) select (r).column2 as col_a, (rr).column2 as col_b from
cte join (select rr from (values(1,7),(3,8)) rr limit2) ss on (r).column1 = (rr).column1; select pg_get_viewdef('tt24v', true); create view tt25v as with cte as materialized (select pg_get_keywords() k) select (k).word from cte; select pg_get_viewdef('tt25v', true); -- also check cases seen only in EXPLAIN explain (verbose, costs off) select * from tt24v; explain (verbose, costs off) select (r).column2 from (select r from (values(1,2),(3,4)) r limit1) ss;
-- test pretty-print parenthesization rules, and SubLink deparsing
create view tt26v as select x + y + z as c1,
(x * y) + z as c2,
x + (y * z) as c3,
(x + y) * z as c4,
x * (y + z) as c5,
x + (y + z) as c6,
x + (y # z) as c7,
(x > y) AND (y > z OR x > z) as c8,
(x > y) OR (y > z ANDNOT (x > z)) as c9,
(x,y) <> ALL (values(1,2),(3,4)) as c10,
(x,y) <= ANY (values(1,2),(3,4)) as c11 from (values(1,2,3)) v(x,y,z); select pg_get_viewdef('tt26v', true);
-- test restriction on non-system view expansion. createtable tt27v_tbl (a int); create view tt27v asselect a from tt27v_tbl; set restrict_nonsystem_relation_kind to'view'; select a from tt27v where a > 0; -- Error insertinto tt27v values (1); -- Error select viewname from pg_views where viewname = 'tt27v'; -- Ok to access a system view.
reset restrict_nonsystem_relation_kind;
-- clean up all the random objects we made above DROPSCHEMA temp_view_test CASCADE; DROPSCHEMA testviewschm2 CASCADE;
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.26Bemerkung:
(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.