Bruce Momjian [Fri, 17 Jun 2005 02:20:43 +0000 (02:20 +0000)]
Add:
>
> * Create a bitmap of pages that need vacuuming
>
> Instead of sequentially scanning the entire table, have the background
> writer or some other process record pages that have expired rows, then
> VACUUM can look at just those pages rather than the entire table. In
> the event of a system crash, the bitmap would probably be invalidated.
Tom Lane [Wed, 15 Jun 2005 16:24:07 +0000 (16:24 +0000)]
Improve hash method for bitmapsets: some examination of actual outputs
shows that adding a circular shift between words greatly improves the
distribution of hash outputs.
Neil Conway [Wed, 15 Jun 2005 07:27:44 +0000 (07:27 +0000)]
Change the implementation of hash join to attempt to avoid unnecessary
work if either of the join relations are empty. The logic is:
(1) if the inner relation's startup cost is less than the outer
relation's startup cost and this is not an outer join, read
a single tuple from the inner relation via ExecHash()
- if NULL, we're done
(2) read a single tuple from the outer relation
- if NULL, we're done
(3) build the hash table on the inner relation
- if hash table is empty and this is not an outer join,
we're done
(4) otherwise, do hash join as usual
The implementation uses the new MultiExecProcNode API, per a
suggestion from Tom: invoking ExecHash() now produces the first
tuple from the Hash node's child node, whereas MultiExecHash()
builds the hash table.
I had to put in a bit of a kludge to get the row count returned
for EXPLAIN ANALYZE to be correct: since ExecHash() is invoked to
return a tuple, and then MultiExecHash() is invoked, we would
return one too many tuples to EXPLAIN ANALYZE. I hacked around
this by just manually detecting this situation and subtracting 1
from the EXPLAIN ANALYZE row count.
Bruce Momjian [Wed, 15 Jun 2005 00:35:16 +0000 (00:35 +0000)]
> Here's a patch I added against plperl, originally against beta5, now
> against rc1. It simply checks with GetDatabaseEncoding() if the current
> database is in UTF-8, and if so, sets the UTF-8 flag on the arguments
> that are passed to perl. This means that it isn't necessary to
> utf8::upgrade() every string, as perl has no way of knowing offhand
> that a string is UTF-8 -- but postgres does, because the database
> encoding is specified, so it makes sense to turn the flag on. You
> should also be able to properly manipulate UTF-8 strings now from
> plperl as opposed to plperlu, because otherwise you'd have to use
> encoding 'utf8' which was not allowed. It could also eliminate some
> unexpected bugs if you assume that perl knows the string is unicode.
It
> is enabled only for perl 5.6 and higher, so earlier versions will not
> be affected.
>
> I have been assured by crab that the patch is quite harmless and will
> not break anything. It would be great to see it in 8 final! :-)
Bruce Momjian [Wed, 15 Jun 2005 00:34:11 +0000 (00:34 +0000)]
This patch makes it possible to use the full set of timezones when doing
"AT TIME ZONE", and not just the shorlist previously available. For
example:
SELECT CURRENT_TIMESTAMP AT TIME ZONE 'Europe/London';
works fine now. It will also obey whatever DST rules were in effect at
just that date, which the previous implementation did not.
It also supports the AT TIME ZONE on the timetz datatype. The whole
handling of DST is a bit bogus there, so I chose to make it use whatever
DST rules are in effect at the time of executig the query. not sure if
anybody is actuallyi *using* timetz though, it seems pretty
unpredictable just because of this...
Bruce Momjian [Wed, 15 Jun 2005 00:09:26 +0000 (00:09 +0000)]
>> Do you agree that using a hashtable for it in general is a good idea
>> assuming this sideeffect is removed, though?
>
>I have no problem with the hashtable, only with preloading it with
>everything. What I'd like to see is that the table inherited at fork()
>contains just the data for the default timezone. (At least in the
>normal case where that setting hasn't been changed since postmaster
>start.)
Here's a patch doing this. Changes score_timezone not to use pg_tzset(),
and thus not loading all the zones in the cache. The actual timezone
being picked will be set using set_global_timezone() which in turn calls
pg_tzset() and loads it in the cache.
Tom Lane [Tue, 14 Jun 2005 22:15:33 +0000 (22:15 +0000)]
Simplify shared-memory lock data structures as per recent discussion:
it is sufficient to track whether a backend holds a lock or not, and
store information about transaction vs. session locks only in the
inside-the-backend LocalLockTable. Since there can now be but one
PROCLOCK per lock per backend, LockCountMyLocks() is no longer needed,
thus eliminating some O(N^2) behavior when a backend holds many locks.
Also simplify the LockAcquire/LockRelease API by passing just a
'sessionLock' boolean instead of a transaction ID. The previous API
was designed with the idea that per-transaction lock holding would be
important for subtransactions, but now that we have subtransactions we
know that this is unwanted. While at it, add an 'isTempObject' parameter
to LockAcquire to indicate whether the lock is being taken on a temp
table. This is not used just yet, but will be needed shortly for
two-phase commit.
Bruce Momjian [Tue, 14 Jun 2005 17:50:38 +0000 (17:50 +0000)]
Attached is a makefile I hacked up to build pg_config under MSVC - the
reason is that it's required (more or less) in order to build the latest
DBD::Pg code and I was testing that out under MSVC.
Bruce Momjian [Tue, 14 Jun 2005 17:43:14 +0000 (17:43 +0000)]
Add GUC krb_server_hostname so the server hostname can be specified as
part of service principal. If not set, any service principal matching
an entry in the keytab can be used.
Tom Lane [Tue, 14 Jun 2005 14:21:16 +0000 (14:21 +0000)]
The random selection in function linear() could deliver a value equal to max
if geqo_rand() returns exactly 1.0, resulting in failure due to indexing
off the end of the pool array. Also, since this is using inexact float math,
it seems wise to guard against roundoff error producing values slightly
outside the expected range. Per report from bug@zedware.org.
Teodor Sigaev [Tue, 14 Jun 2005 11:45:14 +0000 (11:45 +0000)]
WAL for GiST. It work for online backup and so on, but on
recovery after crash (power loss etc) it may say that it can't restore
index and index should be reindexed.
Neil Conway [Tue, 14 Jun 2005 06:43:15 +0000 (06:43 +0000)]
Allow the parameters to PL/PgSQL's RAISE statement to be expressions,
instead of just scalar variables. Add regression tests and update the
documentation. Along the way, remove some redundant error checking
code from exec_stmt_perform().
Original patch from Pavel Stehule, reworked by Neil Conway.
Tom Lane [Tue, 14 Jun 2005 04:04:30 +0000 (04:04 +0000)]
Teach planner to optionally ignore index columns that have an equality
constraint while determining whether the index sort order matches the
query's ORDER BY. This for example allows an index on (x,y) to match
... WHERE x = 42 ORDER BY y;
It only works for btree indexes, but since those are the only ones we
currently have that are ordered at all, that's good enough for now.
Per popular demand.
Neil Conway [Tue, 14 Jun 2005 00:10:02 +0000 (00:10 +0000)]
Cleanup for "#option dump" in PL/PgSQL: don't print empty ELSE blocks,
fix two grammatical errors, and print the INTO target of EXECUTE INTO
if one is specified.
Tom Lane [Mon, 13 Jun 2005 23:14:49 +0000 (23:14 +0000)]
Change the planner to allow indexscan qualification clauses to use
nonconsecutive columns of a multicolumn index, as per discussion around
mid-May (pghackers thread "Best way to scan on-disk bitmaps"). This
turns out to require only minimal changes in btree, and so far as I can
see none at all in GiST. btcostestimate did need some work, but its
original assumption that index selectivity == heap selectivity was
quite bogus even before this.
Neil Conway [Mon, 13 Jun 2005 06:36:22 +0000 (06:36 +0000)]
Per discussion on -hackers, this patch changes psql's "expanded" output
mode to only affect the presentation of normal query results, not the
output of psql slash commands. Documentation updated. I also made
some unrelated minor psql cleanup. Per suggestion from Stuart Cooper.
Tom Lane [Mon, 13 Jun 2005 02:26:53 +0000 (02:26 +0000)]
Adjust lo_open() so that specifying INV_READ without INV_WRITE creates
a descriptor that uses the current transaction snapshot, rather than
SnapshotNow as it did before (and still does if INV_WRITE is set).
This means pg_dump will now dump a consistent snapshot of large object
contents, as it never could do before. Also, add a lo_create() function
that is similar to lo_creat() but allows the desired OID of the large
object to be specified. This will simplify pg_restore considerably
(but I'll fix that in a separate commit).
Neil Conway [Sun, 12 Jun 2005 00:07:07 +0000 (00:07 +0000)]
This patch removes some old code from libpq that implements a URI-like
syntax for database connection parameters. It has been inside an
#ifdef NOT_USED block since 2001 or so and is marked as "broken", so
I don't think it is likely to be rehabilitated any time soon.
Neil Conway [Sun, 12 Jun 2005 00:00:21 +0000 (00:00 +0000)]
libpq was not consistently checking for memory allocation failures. This
patch adds missing checks to the call sites of malloc(), strdup(),
PQmakeEmptyPGresult(), pqResultAlloc(), and pqResultStrdup(), and updates
the documentation. Per original report from Volkan Yazici about
PQmakeEmptyPGresult() not checking for malloc() failure.
Tom Lane [Fri, 10 Jun 2005 22:25:37 +0000 (22:25 +0000)]
Separate predicate-testing code out of indxpath.c, making it a module
in its own right. As proposed by Simon Riggs, but with some editorializing
of my own.
Neil Conway [Fri, 10 Jun 2005 16:23:11 +0000 (16:23 +0000)]
Implement two new special variables in PL/PgSQL: SQLSTATE and SQLERRM.
These contain the SQLSTATE and error message of the current exception,
respectively. They are scope-local variables that are only defined
in exception handlers (so attempting to reference them outside an
exception handler is an error). Update the regression tests and the
documentation.
Also, do some minor related cleanup: export an unpack_sql_state()
function from the backend and use it to unpack a SQLSTATE into a
string, and add a free_var() function to pl_exec.c
Original patch from Pavel Stehule, review by Neil Conway.
Bruce Momjian [Fri, 10 Jun 2005 15:34:26 +0000 (15:34 +0000)]
the following patch makes the filename used to store the readline
history customizable through a variable named HISTFILE, analogous to
psql's already implemented HISTCONTROL and HISTSIZE variables, and
bash's HISTFILE-Variable.
The motivation was to be able to get psql to maintain separate
histories for separate databases. This is now easily achievable
through a line like the following in ~/.psqlrc:
Tom Lane [Fri, 10 Jun 2005 03:32:25 +0000 (03:32 +0000)]
Quick hack to allow the outer query's tuple_fraction to be passed down
to a subquery if the outer query is simple enough that the LIMIT can
be reflected directly to the subquery. This didn't use to be very
interesting, because a subquery that couldn't have been flattened into
the upper query was usually not going to be very responsive to
tuple_fraction anyway. But with new code that allows UNION ALL subqueries
to pay attention to tuple_fraction, this is useful to do. In particular
this lets the optimization occur when the UNION ALL is directly inside
a view.
Tom Lane [Fri, 10 Jun 2005 02:21:05 +0000 (02:21 +0000)]
If a LIMIT is applied to a UNION ALL query, plan each UNION arm as
if the limit were directly applied to it. This does not actually
add a LIMIT plan node to the generated subqueries --- that would be
useless overhead --- but it does cause the planner to prefer fast-
start plans when the limit is small. After an idea from Phil Endecott.
Tom Lane [Fri, 10 Jun 2005 00:28:54 +0000 (00:28 +0000)]
Revise searching of subplan target lists to use something more efficient
than tlist_member calls. Building a large join tlist is still O(N^2),
but with a much smaller constant factor than before.
Bruce Momjian [Thu, 9 Jun 2005 22:29:52 +0000 (22:29 +0000)]
This patch against 8.0.0beta1 source adds log_line_prefix options for
millisecond timestamps (%m) and remote host (%h). The milliseconds are
useful for QPS measurements.
Tom Lane [Thu, 9 Jun 2005 21:52:07 +0000 (21:52 +0000)]
Fix assign_datestyle() so that it doesn't misleadingly complain about
'conflicting datestyle specifications' for input that's actually only
redundant, such as SET DATESTYLE = MDY, MDY. Per recent gripe.
Tom Lane [Thu, 9 Jun 2005 21:25:22 +0000 (21:25 +0000)]
Make SPI set SPI_processed for CREATE TABLE AS / SELECT INTO commands;
this in turn causes CREATE TABLE AS in plpgsql to set ROW_COUNT.
This is how it behaved before 7.4; I had unintentionally changed the
behavior in a bit of sloppy micro-optimization.
Bruce Momjian [Thu, 9 Jun 2005 17:56:51 +0000 (17:56 +0000)]
Since I needed this feature badly, I added the -n / --schema switch to
pg_restore. It restores the given schemaname only. It can be used in
conjunction with the -t and other switches to make the selection very
fine grained.
Bruce Momjian [Thu, 9 Jun 2005 16:35:09 +0000 (16:35 +0000)]
Please find attached a patch (diff -c against cvs HEAD) to add a
function that accepts a double precision argument assumed to be a Unix
epoch timestamp and returns timestamp with time zone, and accompanying
documentation.
Bruce Momjian [Thu, 9 Jun 2005 15:27:27 +0000 (15:27 +0000)]
I've created a patch which adds support for troff "-ms" output to
psql. i.e. "\pset format troff-ms". The patch also corrects some
problems with the "latex" format, notably defining an extra column in
the output table, and correcting some alignment issues; it also
changes the output to match the border setting as documented in the
manual page and as shown with the "aligned" format.
The troff-ms output is mostly identical to the latex output allowing
for the differences between the two typesetters.
The output should be saved in a file and piped as follows:
Because it contains tabs, you'll need to redirect psql output or use
"script", rather than pasting from a terminal window, due to the tabs
which can be replaced with spaces.
Tom Lane [Thu, 9 Jun 2005 04:19:00 +0000 (04:19 +0000)]
Simplify the planner's join clause management by storing join clauses
of a relation in a flat 'joininfo' list. The former arrangement grouped
the join clauses according to the set of unjoined relids used in each;
however, profiling on test cases involving lots of joins proves that
that data structure is a net loss. It takes more time to group the
join clauses together than is saved by avoiding duplicate tests later.
It doesn't help any that there are usually not more than one or two
clauses per group ...
Bruce Momjian [Thu, 9 Jun 2005 03:00:43 +0000 (03:00 +0000)]
Remove idea of schema tablespaces:
< o Allow databases and schemas to be moved to different tablespaces
<
< One complexity is whether moving a schema should move all existing
< schema objects or just define the location for future object creation.
<
> o Allow databases to be moved to different tablespaces 484c480
< schema. Global system tables can never be moved.
> tablespace. Global system tables can never be moved.
Tom Lane [Wed, 8 Jun 2005 23:02:05 +0000 (23:02 +0000)]
Marginal hack to avoid spending a lot of time in find_join_rel during
large planning problems: when the list of join rels gets too long, make
an auxiliary hash table that hashes on the identifying Bitmapset.
Tom Lane [Wed, 8 Jun 2005 21:15:29 +0000 (21:15 +0000)]
Remove grammar productions for prefix and postfix % and ^ operators,
as well as the existing pg_catalog entries for prefix and postfix %.
These have never been documented, though they did appear in one old
regression test. This avoids surprising behavior in cases like
"SELECT -25 % -10". Per recent discussion.
Note: although there is a catalog change here, I did not force initdb
since there's no harm in leaving the inaccessible entries in one's
copy of pg_operator.
Tom Lane [Wed, 8 Jun 2005 15:50:28 +0000 (15:50 +0000)]
Change WAL-logging scheme for multixacts to be more like regular
transaction IDs, rather than like subtrans; in particular, the information
now survives a database restart. Per previous discussion, this is
essential for PITR log shipping and for 2PC.
Bruce Momjian [Tue, 7 Jun 2005 14:12:07 +0000 (14:12 +0000)]
Fix word wrap:
< changes made by the interface driver for its internal use. One idea is
< for this to be a protocol-only feature. Another approach is to notify
< the protocol when a RESET CONNECTION command is used.
> changes made by the interface driver for its internal use. One idea
> is for this to be a protocol-only feature. Another approach is to
> notify the protocol when a RESET CONNECTION command is used.
Neil Conway [Tue, 7 Jun 2005 07:08:35 +0000 (07:08 +0000)]
Add a function lastval(), which returns the value returned by the
last nextval() or setval() performed by the current session. Update the
docs, add regression tests, and bump the catalog version. Patch from
Dennis Björklund, various improvements by Neil Conway.
Neil Conway [Tue, 7 Jun 2005 02:47:23 +0000 (02:47 +0000)]
Add support for an optional INTO clause to PL/PgSQL's EXECUTE command.
This allows the result of executing a SELECT to be assigned to a row
variable, record variable, or list of scalars. Docs and regression tests
updated. Per Pavel Stehule, improvements and cleanup by Neil Conway.
Bruce Momjian [Tue, 7 Jun 2005 01:59:39 +0000 (01:59 +0000)]
Update text for RESET CONNECTION:
< all temporary tables, removal of any NOTIFYs, cursors, prepared
< queries(?), currval()s, etc. This could be used for connection pooling.
< We could also change RESET ALL to have this functionality.
> temporary tables, removing any NOTIFYs, cursors, open transactions,
> prepared queries, currval()s, etc. This could be used for connection
> pooling. We could also change RESET ALL to have this functionality.
> The difficult of this features is allowing RESET ALL to not affect
> changes made by the interface driver for its internal use. One idea is
> for this to be a protocol-only feature. Another approach is to notify
> the protocol when a RESET CONNECTION command is used.
While playing around, I got the following error message:
--
FATAL: pre-existing shared memory block (key 5432001, ID 90898435) is
still in use
HINT: If you're sure there are no old server processes still running,
remove the shared memory block with the command "ipcrm", or just delete
the file "/home/hlinnaka/pgsql/data/postmaster.pid".
---
Thats normal because I used "kill -9 postmaster" to shut down.
The hint advises me to use "ipcrm", but there's the "ipcclean" script in
bin for just this purpose. The hint should probably advise to use
ipcclean.
The attached patch replaces all occurances of "ipcrm" with "ipcclean" in
src/backend/utils/init/miscinit.c and all the translations in
src/backend/po.
While reviewing the patch, I noticed a likely typo in hr.po. While I
don't
speak Croatian, the translation seems to advise to use the "icpm(1)"
command. I changed that to "ipcclean" too.
Tom Lane [Mon, 6 Jun 2005 20:22:58 +0000 (20:22 +0000)]
Modify XLogInsert API to make callers specify whether pages to be backed
up have the standard layout with unused space between pd_lower and pd_upper.
When this is set, XLogInsert will omit the unused space without bothering
to scan it to see if it's zero. That saves time in XLogInsert, and also
allows reversion of my earlier patch to make PageRepairFragmentation et al
explicitly re-zero freed space. Per suggestion by Heikki Linnakangas.
Tom Lane [Mon, 6 Jun 2005 17:01:25 +0000 (17:01 +0000)]
Remove the mostly-stubbed-out-anyway support routines for WAL UNDO.
That code is never going to be used in the foreseeable future, and
where it's more than a stub it's making the redo routines harder to
read.