Remove Wisconsin benchmark files.

This test is clearly not being used anymore, since it's been broken for
long periods of time without anyone noticing.  Per discussion, it's not
worth keeping in our source tree.
This commit is contained in:
Tom Lane 2009-08-15 16:16:01 +00:00
parent b328853733
commit a05a4b478d
39 changed files with 0 additions and 259 deletions

View File

@ -1,51 +0,0 @@
#-------------------------------------------------------------------------
#
# Makefile--
# Makefile for the Wisconsin Benchmark
#
# Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
# Portions Copyright (c) 1994-5, Regents of the University of California
#
#
# IDENTIFICATION
# $PostgreSQL: pgsql/src/test/bench/Makefile,v 1.17 2009/01/01 17:24:04 momjian Exp $
#
#-------------------------------------------------------------------------
subdir = src/test/bench
top_builddir = ../../..
include $(top_builddir)/src/Makefile.global
CREATEFILES= create.sql bench.sql
OUTFILES= bench.out bench.out.perquery
all: $(CREATEFILES)
rm -f $(OUTFILES)
create.sql: create.source
rm -f $@; \
C=`pwd`; \
sed -e "s:_CWD_:$$C:g" < $< > $@
bench.sql:
x=1; \
for i in `ls query[0-9][0-9]`; do \
echo "select $$x as x" >> bench.sql && \
cat $$i >> bench.sql && \
x=`expr $$x + 1` || exit; \
done
runtest: $(OUTFILES)
bench.out: $(CREATEFILES)
$(SHELL) ./create.sh $$PGDATA && \
$(SHELL) ./runwisc.sh $$PGDATA > $@
@echo "RESULTS OF BENCHMARK ARE SAVED IN FILE bench.out";
bench.out.perquery: bench.out
$(SHELL) ./perquery <bench.out > $@
@echo "BREAKDOWN OF BENCHMARK IS SAVED IN FILE bench.out.perquery";
clean:
rm -f $(OUTFILES) $(CREATEFILES)

View File

@ -1,36 +0,0 @@
The Postgres Wisconsin Benchmark
The short form of the directions below:
ensure postmaster is stopped
export PGDATA=/wherever
make runtest
The long form:
In this directory are the queries and raw data files used to populate the
Postgres version of the Wisconsin benchmark. In order to run the benchmark,
you'll initially need to execute the script
./create.sh
which will populate the "bench" database, create the indices, and vacuum the
database. This will take from 10 minutes or so on a Sparc II/DECstation 5000
class machine to an hour on a Sun 3.
Once create.sh completes, you can execute the benchmark by running the
script
./runwisc.sh
into an output file. This output file may be quite large (300K or so)
so make sure you have sufficient disk space. Once the benchmark run has
completed, query execution times can be obtained by running the
./perquery
script on the output file. It will generate a nicely formatted, numbered
set of output with times for each query indicated. (Note that each query
is run twice.)
!!! WARNING! DO NOT RUN THESE SCRIPTS IF THE POSTMASTER IS RUNNING !!!

View File

@ -1,28 +0,0 @@
#!/bin/sh
# $PostgreSQL: pgsql/src/test/bench/create.sh,v 1.7 2009/08/14 18:49:34 tgl Exp $
#
if [ ! -d $1 ]; then
echo " you must specify a valid data directory " >&2
exit
fi
if [ -d ./obj ]; then
cd ./obj
fi
echo =============== destroying old bench database... =================
echo "drop database bench" | postgres --single -D"$1" postgres > /dev/null
echo =============== creating new bench database... =================
echo "create database bench" | postgres --single -D"$1" postgres > /dev/null
if [ $? -ne 0 ]; then
echo createdb failed
exit 1
fi
postgres --single -D${1} bench < create.sql > /dev/null
if [ $? -ne 0 ]; then
echo initial database load failed
exit 1
fi
exit 0

View File

@ -1,17 +0,0 @@
create table onek(unique1 int4,unique2 int4,two int4,four int4,ten int4,twenty int4, hundred int4,thousand int4,twothousand int4,fivethous int4,tenthous int4,odd int4, even int4,stringu1 name,stringu2 name,string4 name);
create table tenk1 (unique1 int4,unique2 int4, two int4,four int4,ten int4,twenty int4,hundred int4,thousand int4,twothousand int4,fivethous int4,tenthous int4,odd int4,even int4,stringu1 name,stringu2 name,string4 name);
create table tenk2 (unique1 int4, unique2 int4, two int4, four int4,ten int4, twenty int4, hundred int4, thousand int4, twothousand int4,fivethous int4, tenthous int4, odd int4, even int4,stringu1 name,stringu2 name, string4 name);
copy onek from '_CWD_/../regress/data/onek.data';
copy tenk1 from '_CWD_/../regress/data/tenk.data';
copy tenk2 from '_CWD_/../regress/data/tenk.data';
create index onek_unique1 on onek using btree(unique1 int4_ops);
create index onek_unique2 on onek using btree(unique2 int4_ops);
create index onek_hundred on onek using btree(hundred int4_ops);
create index tenk1_unique1 on tenk1 using btree(unique1 int4_ops);
create index tenk1_unique2 on tenk1 using btree(unique2 int4_ops);
create index tenk1_hundred on tenk1 using btree(hundred int4_ops);
create index tenk2_unique1 on tenk2 using btree(unique1 int4_ops);
create index tenk2_unique2 on tenk2 using btree(unique2 int4_ops);
create index tenk2_hundred on tenk2 using btree(hundred int4_ops);
select * into table Bprime from tenk1 t where t.unique2 < 1000;
vacuum;

View File

@ -1,11 +0,0 @@
#!/bin/sh
# $PostgreSQL: pgsql/src/test/bench/perquery,v 1.3 2006/03/11 04:38:41 momjian Exp $
egrep 'x = "|elapse' | \
awk 'BEGIN { x = 0; y = 0; z = 0; a = 0; } \
/.*elapse.*/ {x = $2 + x; y = $4 + y; z = $6 + z;} \
/.*x = ".*/ { \
printf "query %2d: %7.3f real %7.3f user %7.3f sys\n", a, x, y, z; \
x = 0; y = 0; z = 0; a = a + 1; } \
END {printf("query %2d: %7.3f real %7.3f user %7.3f sys\n", a, x, y, z);}'

View File

@ -1,4 +0,0 @@
select * into table temp_bench from tenk1 where (unique2 > 301) and (unique2 < 402);
drop table temp_bench;
select * into table temp_bench from tenk1 where (unique2 > 301) and (unique2 < 402);
drop table temp_bench;

View File

@ -1,4 +0,0 @@
select * into table temp_bench from tenk1 where (unique1 > 647) and (unique1 < 1648);
drop table temp_bench;
select * into table temp_bench from tenk1 where (unique1 > 647) and (unique1 < 1648);
drop table temp_bench;

View File

@ -1,4 +0,0 @@
select * into table temp_bench from tenk1 where (unique2 > 301) and (unique2 < 402);
drop table temp_bench;
select * into table temp_bench from tenk1 where (unique2 > 301) and (unique2 < 402);
drop table temp_bench;

View File

@ -1,4 +0,0 @@
select * into table temp_bench from tenk1 where (unique1 > 647) and (unique1 < 1648);
drop table temp_bench;
select * into table temp_bench from tenk1 where (unique1 > 647) and (unique1 < 1648);
drop table temp_bench;

View File

@ -1,4 +0,0 @@
select * into table temp_bench from tenk1 where (unique2 > 301) and (unique2 < 402);
drop table temp_bench;
select * into table temp_bench from tenk1 where (unique2 > 301) and (unique2 < 402);
drop table temp_bench;

View File

@ -1,4 +0,0 @@
select * into table temp_bench from tenk1 where (unique2 > 647) and (unique2 < 1648);
drop table temp_bench;
select * into table temp_bench from tenk1 where (unique2 > 647) and (unique2 < 1648);
drop table temp_bench;

View File

@ -1,2 +0,0 @@
select * from tenk1 where unique2 = 2001;
select * from tenk1 where unique2 = 2001;

View File

@ -1,2 +0,0 @@
select * from tenk1 where (unique2 > 301) and (unique2 < 402);
select * from tenk1 where (unique2 > 301) and (unique2 < 402);

View File

@ -1,4 +0,0 @@
select t1.*, t2.unique1 AS t2unique1, t2.unique2 AS t2unique2, t2.two AS t2two, t2.four AS t2four, t2.ten AS t2ten, t2.twenty AS t2twenty, t2.hundred AS t2hundred, t2.thousand AS t2thousand, t2.twothousand AS t2twothousand, t2.fivethous AS t2fivethous, t2.tenthous AS t2tenthous, t2.odd AS t2odd, t2.even AS t2even, t2.stringu1 AS t2stringu1, t2.stringu2 AS t2stringu2, t2.string4 AS t2string4 into table temp_bench from tenk1 t1, tenk1 t2 where (t1.unique2 = t2.unique2) and (t2.unique2 < 1000);
drop table temp_bench;
select t1.*, t2.unique1 AS t2unique1, t2.unique2 AS t2unique2, t2.two AS t2two, t2.four AS t2four, t2.ten AS t2ten, t2.twenty AS t2twenty, t2.hundred AS t2hundred, t2.thousand AS t2thousand, t2.twothousand AS t2twothousand, t2.fivethous AS t2fivethous, t2.tenthous AS t2tenthous, t2.odd AS t2odd, t2.even AS t2even, t2.stringu1 AS t2stringu1, t2.stringu2 AS t2stringu2, t2.string4 AS t2string4 into table temp_bench from tenk1 t1, tenk1 t2 where (t1.unique2 = t2.unique2) and (t2.unique2 < 1000);
drop table temp_bench;

View File

@ -1,4 +0,0 @@
select t.*,B.unique1 AS Bunique1,B.unique2 AS Bunique2,B.two AS Btwo,B.four AS Bfour,B.ten AS Bten,B.twenty AS Btwenty,B.hundred AS Bhundred,B.thousand AS Bthousand,B.twothousand AS Btwothousand,B.fivethous AS Bfivethous,B.tenthous AS Btenthous,B.odd AS Bodd,B.even AS Beven,B.stringu1 AS Bstringu1,B.stringu2 AS Bstringu2,B.string4 AS Bstring4 into table temp_bench from tenk1 t, Bprime B where t.unique2 = B.unique2;
drop table temp_bench;
select t.*,B.unique1 AS Bunique1,B.unique2 AS Bunique2,B.two AS Btwo,B.four AS Bfour,B.ten AS Bten,B.twenty AS Btwenty,B.hundred AS Bhundred,B.thousand AS Bthousand,B.twothousand AS Btwothousand,B.fivethous AS Bfivethous,B.tenthous AS Btenthous,B.odd AS Bodd,B.even AS Beven,B.stringu1 AS Bstringu1,B.stringu2 AS Bstringu2,B.string4 AS Bstring4 into table temp_bench from tenk1 t, Bprime B where t.unique2 = B.unique2;
drop table temp_bench;

View File

@ -1,4 +0,0 @@
select t1.*,o.unique1 AS ounique1,o.unique2 AS ounique2,o.two AS otwo,o.four AS ofour,o.ten AS oten,o.twenty AS otwenty,o.hundred AS ohundred,o.thousand AS othousand,o.twothousand AS otwothousand,o.fivethous AS ofivethous,o.tenthous AS otenthous,o.odd AS oodd, o.even AS oeven,o.stringu1 AS ostringu1,o.stringu2 AS ostringu2,o.string4 AS ostring4 into table temp_bench from onek o, tenk1 t1, tenk1 t2 where (o.unique2 = t1.unique2) and (t1.unique2 = t2.unique2) and (t1.unique2 < 1000) and (t2.unique2 < 1000);
drop table temp_bench;
select t1.*,o.unique1 AS ounique1,o.unique2 AS ounique2,o.two AS otwo,o.four AS ofour,o.ten AS oten,o.twenty AS otwenty,o.hundred AS ohundred,o.thousand AS othousand,o.twothousand AS otwothousand,o.fivethous AS ofivethous,o.tenthous AS otenthous,o.odd AS oodd, o.even AS oeven,o.stringu1 AS ostringu1,o.stringu2 AS ostringu2,o.string4 AS ostring4 into table temp_bench from onek o, tenk1 t1, tenk1 t2 where (o.unique2 = t1.unique2) and (t1.unique2 = t2.unique2) and (t1.unique2 < 1000) and (t2.unique2 < 1000);
drop table temp_bench;

View File

@ -1,4 +0,0 @@
select t1.*,t2.unique1 AS t2unique1,t2.unique2 AS t2unique2,t2.two AS t2two, t2.four AS t2four,t2.ten AS t2ten,t2.twenty AS t2twenty,t2.hundred AS t2hundred,t2.thousand AS t2thousand,t2.twothousand AS t2twothousand, t2.fivethous AS t2fivethous,t2.tenthous AS t2tenthous,t2.odd AS t2odd, t2.even AS t2even,t2.stringu1 AS t2stringu1,t2.stringu2 AS t2stringu2, t2.string4 AS t2string4 into table temp_bench from tenk1 t1, tenk2 t2 where (t1.unique2 = t2.unique2) and (t2.unique2 < 1000);
drop table temp_bench;
select t1.*,t2.unique1 AS t2unique1,t2.unique2 AS t2unique2,t2.two AS t2two, t2.four AS t2four,t2.ten AS t2ten,t2.twenty AS t2twenty,t2.hundred AS t2hundred,t2.thousand AS t2thousand,t2.twothousand AS t2twothousand, t2.fivethous AS t2fivethous,t2.tenthous AS t2tenthous,t2.odd AS t2odd, t2.even AS t2even,t2.stringu1 AS t2stringu1,t2.stringu2 AS t2stringu2, t2.string4 AS t2string4 into table temp_bench from tenk1 t1, tenk2 t2 where (t1.unique2 = t2.unique2) and (t2.unique2 < 1000);
drop table temp_bench;

View File

@ -1,4 +0,0 @@
select t.*,B.unique1 AS Bunique1,B.unique2 AS Bunique2,B.two AS Btwo,B.four AS Bfour,B.ten AS Bten,B.twenty AS Btwenty,B.hundred AS Bhundred,B.thousand AS Bthousand,B.twothousand AS Btwothousand,B.fivethous AS Bfivethous,B.tenthous AS Btenthous,B.odd AS Bodd,B.even AS Beven,B.stringu1 AS Bstringu1,B.stringu2 AS Bstringu2,B.string4 AS Bstring4 into table temp_bench from tenk1 t, Bprime B where t.unique2 = B.unique2;
drop table temp_bench;
select t.*,B.unique1 AS Bunique1,B.unique2 AS Bunique2,B.two AS Btwo,B.four AS Bfour,B.ten AS Bten,B.twenty AS Btwenty,B.hundred AS Bhundred,B.thousand AS Bthousand,B.twothousand AS Btwothousand,B.fivethous AS Bfivethous,B.tenthous AS Btenthous,B.odd AS Bodd,B.even AS Beven,B.stringu1 AS Bstringu1,B.stringu2 AS Bstringu2,B.string4 AS Bstring4 into table temp_bench from tenk1 t, Bprime B where t.unique2 = B.unique2;
drop table temp_bench;

View File

@ -1,4 +0,0 @@
select t1.*,o.unique1 AS ounique1,o.unique2 AS ounique2,o.two AS otwo,o.four AS ofour,o.ten AS oten,o.twenty AS otwenty,o.hundred AS ohundred,o.thousand AS othousand,o.twothousand AS otwothousand,o.fivethous AS ofivethous,o.tenthous AS otenthous,o.odd AS oodd, o.even AS oeven,o.stringu1 AS ostringu1,o.stringu2 AS ostringu2,o.string4 AS ostring4 into table temp_bench from onek o, tenk1 t1, tenk1 t2 where (o.unique2 = t1.unique2) and (t1.unique2 = t2.unique2) and (t1.unique2 < 1000) and (t2.unique2 < 1000);
drop table temp_bench;
select t1.*,o.unique1 AS ounique1,o.unique2 AS ounique2,o.two AS otwo,o.four AS ofour,o.ten AS oten,o.twenty AS otwenty,o.hundred AS ohundred,o.thousand AS othousand,o.twothousand AS otwothousand,o.fivethous AS ofivethous,o.tenthous AS otenthous,o.odd AS oodd, o.even AS oeven,o.stringu1 AS ostringu1,o.stringu2 AS ostringu2,o.string4 AS ostring4 into table temp_bench from onek o, tenk1 t1, tenk1 t2 where (o.unique2 = t1.unique2) and (t1.unique2 = t2.unique2) and (t1.unique2 < 1000) and (t2.unique2 < 1000);
drop table temp_bench;

View File

@ -1,4 +0,0 @@
select t1.*, t2.unique1 AS t2unique1, t2.unique2 AS t2unique2, t2.two AS t2two, t2.four AS t2four, t2.ten AS t2ten, t2.twenty AS t2twenty, t2.hundred AS t2hundred, t2.thousand AS t2thousand,t2.twothousand AS t2twothousand, t2.fivethous AS t2fivethous, t2.tenthous AS t2tenthous, t2.odd AS t2odd, t2.even AS t2even, t2.stringu1 AS t2stringu1, t2.stringu2 AS t2stringu2, t2.string4 AS t2string4 into table temp_bench from tenk1 t1, tenk2 t2 where (t1.unique1 = t2.unique1) and (t2.unique1 < 1000);
drop table temp_bench;
select t1.*, t2.unique1 AS t2unique1, t2.unique2 AS t2unique2, t2.two AS t2two, t2.four AS t2four, t2.ten AS t2ten, t2.twenty AS t2twenty, t2.hundred AS t2hundred, t2.thousand AS t2thousand,t2.twothousand AS t2twothousand, t2.fivethous AS t2fivethous, t2.tenthous AS t2tenthous, t2.odd AS t2odd, t2.even AS t2even, t2.stringu1 AS t2stringu1, t2.stringu2 AS t2stringu2, t2.string4 AS t2string4 into table temp_bench from tenk1 t1, tenk2 t2 where (t1.unique1 = t2.unique1) and (t2.unique1 < 1000);
drop table temp_bench;

View File

@ -1,4 +0,0 @@
select t.*, B.unique1 AS Bunique1,B.unique2 AS Bunique2,B.two AS Btwo,B.four AS Bfour,B.ten AS Bten, B.twenty AS Btwenty, B.hundred AS Bhundred,B.thousand AS Bthousand,B.twothousand AS Btwothousand, B.fivethous AS Bfivethous,B.tenthous AS Btenthous,B.odd AS Bodd, B.even AS Beven,B.stringu1 AS Bstringu1,B.stringu2 AS Bstringu2,B.string4 AS Bstring4 into table temp_bench from tenk1 t, Bprime B where t.unique1 = B.unique1;
drop table temp_bench;
select t.*, B.unique1 AS Bunique1,B.unique2 AS Bunique2,B.two AS Btwo,B.four AS Bfour,B.ten AS Bten, B.twenty AS Btwenty, B.hundred AS Bhundred,B.thousand AS Bthousand,B.twothousand AS Btwothousand, B.fivethous AS Bfivethous,B.tenthous AS Btenthous,B.odd AS Bodd, B.even AS Beven,B.stringu1 AS Bstringu1,B.stringu2 AS Bstringu2,B.string4 AS Bstring4 into table temp_bench from tenk1 t, Bprime B where t.unique1 = B.unique1;
drop table temp_bench;

View File

@ -1,4 +0,0 @@
select t1.*, o.unique1 AS ounique1,o.unique2 AS ounique2,o.two AS otwo,o.four AS ofour,o.ten AS oten,o.twenty AS otwenty,o.hundred AS ohundred,o.thousand AS othousand,o.twothousand AS otwothousand,o.fivethous AS ofivethous,o.tenthous AS otenthous,o.odd AS oodd, o.even AS oeven,o.stringu1 AS ostringu1,o.stringu2 AS ostringu2,o.string4 AS ostring4 into table temp_bench from onek o, tenk1 t1, tenk2 t2 where (o.unique1 = t1.unique1) and (t1.unique1 = t2.unique1) and (t1.unique1 < 1000) and (t2.unique1 < 1000);
drop table temp_bench;
select t1.*, o.unique1 AS ounique1,o.unique2 AS ounique2,o.two AS otwo,o.four AS ofour,o.ten AS oten,o.twenty AS otwenty,o.hundred AS ohundred,o.thousand AS othousand,o.twothousand AS otwothousand,o.fivethous AS ofivethous,o.tenthous AS otenthous,o.odd AS oodd, o.even AS oeven,o.stringu1 AS ostringu1,o.stringu2 AS ostringu2,o.string4 AS ostring4 into table temp_bench from onek o, tenk1 t1, tenk2 t2 where (o.unique1 = t1.unique1) and (t1.unique1 = t2.unique1) and (t1.unique1 < 1000) and (t2.unique1 < 1000);
drop table temp_bench;

View File

@ -1,4 +0,0 @@
select two, four, ten, twenty, hundred, string4 into table temp_bench from tenk1;
drop table temp_bench;
select two, four, ten, twenty, hundred, string4 into table temp_bench from tenk1;
drop table temp_bench;

View File

@ -1,4 +0,0 @@
select * into table temp_bench from onek;
drop table temp_bench;
select * into table temp_bench from onek;
drop table temp_bench;

View File

@ -1,4 +0,0 @@
select min(unique2) as x into table temp_bench from tenk1;
drop table temp_bench;
select min(unique2) as x into table temp_bench from tenk1;
drop table temp_bench;

View File

View File

View File

@ -1,4 +0,0 @@
select min(unique2) as x into table temp_bench from tenk1;
drop table temp_bench;
select min(unique2) as x into table temp_bench from tenk1;
drop table temp_bench;

View File

View File

View File

@ -1,2 +0,0 @@
insert into tenk1 (unique1, unique2, two, four, ten, twenty, hundred, thousand, twothousand, fivethous, tenthous, odd, even,stringu1,stringu2, string4) values (1000, 74, 0, 2, 0, 10, 50, 688, 1950, 4950, 9950, 1, 100, 'ron may choi','jae kwang choi', 'u. c. berkeley');
insert into tenk1 (unique1, unique2, two, four, ten, twenty, hundred, thousand, twothousand, fivethous, tenthous, odd, even, stringu1, stringu2, string4) values (1999, 60, 0, 2, 0, 10, 50, 688, 1950, 4950, 9950, 1, 100, 'ron may choi', 'jae kwang choi', 'u. c. berkeley');

View File

@ -1,2 +0,0 @@
delete from tenk1 where tenk1.unique2 = 877;
delete from tenk1 where tenk1.unique2 = 876;

View File

@ -1,2 +0,0 @@
update tenk1 set unique2 = 10001 where tenk1.unique2 =1491;
update tenk1 set unique2 = 10023 where tenk1.unique2 =1480;

View File

@ -1,2 +0,0 @@
insert into tenk1 (unique1, unique2, two, four, ten, twenty, hundred, thousand, twothousand, fivethous, tenthous, odd, even, stringu1, stringu2, string4) values (1000, 70, 0, 2, 0, 10, 50, 688, 1950, 4950, 9950, 1, 100, 'ron may choi', 'jae kwang choi', 'u. c. berkeley');
insert into tenk1 (unique1, unique2, two, four, ten, twenty, hundred, thousand, twothousand, fivethous, tenthous, odd, even, stringu1, stringu2, string4) values (500, 40, 0, 2, 0, 10, 50, 688, 1950, 4950, 9950, 1, 100, 'ron may choi', 'jae kwang choi', 'u. c. berkeley');

View File

@ -1,2 +0,0 @@
delete from tenk1 where tenk1.unique2 = 10001;
delete from tenk1 where tenk1.unique2 = 900;

View File

@ -1,2 +0,0 @@
update tenk1 set unique2 = 10088 where tenk1.unique2 =187;
update tenk1 set unique2 = 10003 where tenk1.unique2 =2000;

View File

@ -1,2 +0,0 @@
update tenk1 set unique2 = 10020 where tenk1.unique2 =1974;
update tenk1 set unique2 = 160 where tenk1.unique2 =1140;

View File

@ -1,17 +0,0 @@
#!/bin/sh
# $PostgreSQL: pgsql/src/test/bench/runwisc.sh,v 1.11 2009/08/14 18:49:34 tgl Exp $
if [ ! -d $1 ]; then
echo " you must specify a valid data directory " >&2
exit
fi
if [ -d ./obj ]; then
cd ./obj
fi
echo =============== vacuuming benchmark database... ================= >&2
echo "vacuum" | postgres --single -D"$1" bench > /dev/null
echo =============== running benchmark... ================= >&2
time postgres --single -D"$1" -texecutor -tplanner -c log_min_messages=log -c log_destination=stderr -c logging_collector=off bench < bench.sql 2>&1

View File

@ -1,5 +0,0 @@
#!/bin/sh
sh create.sh
echo Running the benchmark....
sh runwisc.sh