.\".he '\*(dA'DRAFT'\*(tI' \" comment out in production version .\"======================================================== .de cW \" arg3arg1arg2, constant-width arg1 \&\\$3\\fC\\$1\\fP\\$2 .\"\&\\$3\\fC\\s-1\\$1\\s0\\fP\\$2 .. .\"------------------------------------ .de (P \" prologue for constant-width block .ft C .ps -1 .vs -1 .. .\"----------------- .de )P \" epilogue for constant-width block .vs +1 .ps +1 .ft P .. .\"------------------------------------ .de (T \" prologue for constant-width table .(P .in +\\n(biu .. .\"----------------- .de )T \" epilogue for constant-width table .in -\\n(biu .)P .. .\"------------------------------------ .de (C \" begin constant-width list .(l .(P .. .\"----------------- .de )C \" end constant-width list .)P .)l .. .\"--------------------------------------------------------------------------- .ds rM Reference Manual .ds uM User Manual .ds uX \s-2UNIX\s0 .ds vC Version 4.0 .ds vP Version 3.1 .\"--------------------------------------------------------------------------- .\" .\" release4.0.me: postgres version 4.0 release notes. print using .\" psroff -me. .\" .nr pi 3n .nr si 2n .nr pp 11 .nr tp 11 .nr sp 11 .de RV .ie "\\$2"" \ \{\ . ds VN "0.0 . ds VD "(No date) . ds VT "UNAUDITED VERSION .\} .el \ \{\ . ds VN \\$3 . ds VD \\$4 . ie "\\$7"Exp" \ . ds VT "DRAFT . el \ . ds VT \\$7 .\} .. .RV $Header: /usr/local/dev/postgres/mastertree/doc/RCS/release.4.0.me,v 1.13 1992/07/14 23:24:14 mao Exp $ .ds PG "\\s-2POSTGRES\\s0 .ds PQ "\\s-2POSTQUEL\\s0 .ce 99 .ft B .ps 14 \*(PG \*(vC .sp 0.5v Release Notes .sp .ps 11 \*(VD .ce 0 .he '\*(PG \*(vC Release Notes'%'\*(VD' .ft P .sp 2 .sh 1 "Introduction" .pp These are the release notes for \*(vC of the \*(PG database system from UC Berkeley. The database system and its installation procedure are covered in detail in the setup document for this release, which can be found in the file .cW $POSTGRESHOME/doc/postgres-setup.me . Here, we cover only the most important differences from \*(vP and earlier versions of the system. .sh 1 "Aim" .pp This release provides improved functionality over \*(vP in many areas of the system. In particular, significant advances have been made in \*(PG functions and large objects. .sh 1 "Changes to \*(PQ" .sh 2 "define function" .pp The syntax for defining functions has been changed slightly. \*(PG now supports functions that can return sets of values. To declare such a function you use the keyword .cW setof before the actual type name when specifying the return type: .(C define function hobbies (language = "postquel", returntype = setof hobbies_r) arg is (emp) as "retrieve (hobbies_r.all) where hobbies_r.person = $1.name" .)C The function .cW hobbies is declared to return a set of instances from the class .cW hobbies_r . Had .cW setof been omitted, the .cW retrieve would be executed exactly one time and the first instance retrieved would be the only return value. The primary reason for forcing this distinction is that \*(PQ functions declared to return a single value can be used in a much more general fashion than functions returning a set of results. .lp \*(PG does not support functions or operators with sets as arguments. For example: .(C define function alwaysone (language = "postquel", returntype = int4) as "retrieve (x = 1)" .)C Calls to .cW alwaysone may be used as though they were constants. In contrast, if we had declared the return type to be .cW "setof int4" , .cW alwaysone would be forbidden as an argument to functions and/or operators. .pp \*(PG now provides much better optimization of expensive functions. To aid the optimizer, the author of a C function can now choose to specify parameters which will be used to determine the function's .q cost in the query under consideration. For complete details see the \*(rM page on functions. .sh 2 "NULL Detection" .pp \*(PG now recognizes the keywords .cW ISNULL and .cW NOTNULL and allows qualifications based on whether or not an attribute is null. The general syntax in qualifications is: .(C where \f2expression\fP ISNULL where \f2expression\fP NOTNULL .)C .sh 2 "Unified Syntax for Functions and Attributes" .pp If a \*(PQ function is declared that takes instances of a class as its only argument, it may be invoked in two different ways. For example, assume that the function .cW overpaid has been declared in \*(PQ to take an instance of the .cW emp class and return a boolean value. Then the two queries .(C retrieve (emp.overpaid) retrieve (overpaid = overpaid(emp)) .)C are exactly equivalent. Similarly, attributes may be referenced in the same ways. If .cW emp has an attribute .cW salary , then .(C retrieve (emp.salary) retrieve (salary = salary(emp)) .)C are equivalent. Both of these may be considered parameterless method calls on instances of the .cW emp class. .sh 2 "Binary Portals" .pp It is now possible to get data out of \*(PG in binary format. The query syntax is .(C retrieve iportal \f2portal name\fP (\f2target list\fP) \f2qualifiers\fP .)C Taking advantage of this feature should speed up .cW libpq application programs considerably. See the \*(rM for all of the details. .sh 2 "Arrays" .pp In previous releases array indirection values were required to be integer constants. In \*(vC they can be any expression as long as the expression is of type int4. For example the following queries are now legal .(C retrieve (foo.a[1+2], foo[arrayind.i], foo.a) retrieve (foo.a[arrayind.i]) where arrayind.i <= 3 .)C .sh 1 "General System Changes" .sh 2 "Functions" .pp The big story of the \*(vC release is improved \*(PQ functions. \*(PQ function support in previous releases suffered from the following limitations: .ip \0\0\(bu They could take only a single argument, which had to be an instance of some class. .ip \0\0\(bu They had to return a set of instances of some class. .ip \0\0\(bu No run-time or declaration-time type checking was performed to verify that the arguments or return value of the function were correctly typed. .pp \*(PQ functions in \*(vP of \*(PG were implemented using the rewrite rules system. \*(vC supports query language functions as first-class citizens, and no longer relies on the rules system to implement them. As a result, the shortcomings listed above have been eliminated. .pp There are no special restrictions on the types or the number of arguments, nor is there any restriction on the type of the result. As outlined above, the syntax for defining a \*(PQ function is analogous to defining a C function. The biggest difference is that the .cW as clause must contain a quoted list of \*(PQ queries. Within the body of the function, $\f2number\fP refers to the .i number th parameter passed in by the caller. See the \*(rM for details. .pp C functions have also been improved. In previous releases C functions were restricted to taking at most one .q tuple argument, that is, an argument whose type is an instance of some class. In \*(vC, C functions can take up to eight tuple arguments.\** .(f The 8-argument limit applies to .b all \*(PG functions. .)f .pp Finally, \*(PG provides enhanced optimization of both C and \*(PQ functions. In the case of C functions, the optimizer takes user-specified parameters on cost into account when deciding how to execute a query. .pp \*(PQ functions have one important limitation: system attributes (for example, .cW tmin , .cW tmax , and .cW oid ) of function return values and parameters cannot be referenced. The \*(PG parser checks this condition when a function is defined and invoked, and prints a descriptive error message if the condition is violated. This limitation will be removed in a future release of the system. .sh 2 "Revised Support for Nested Relations" .pp \*(vP of \*(PG supported nested relations using tuple-valued attributes and rewrite rules. For example, given the declarations: .(C create person (name = char16, child = char16) addattr (parent = person) to person define rewrite rule find_parent on retrieve to person.parent do instead retrieve (person.all) where person.child = current.name .)C it was possible to refer to .(C person.parent.name .)C and have the correct name fetched by \*(PG. .lp In \*(vC of \*(PG, rewrite rules are no longer used to support nested relations. Instead, a function should be declared that returns tuples of the appropriate type. For example, in \*(vC, .(C create person (name = char16, child = char16) define function parent (language = "postquel", returntype = person) arg is (person) as "retrieve (person.all) where person.child = $1.name" .)C are equivalent to the rule and attribute additions shown above. The same nested-dot notation is supported for functions as was supported for rewrite rules. .pp As a side effect of the improved support for functions, it is not possible in \*(vC to create a relation which has an attribute that is of a complex (tuple) type. For example, the .cW addattr command shown above is illegal in this release of \*(PG, since the type of the attribute being added is .cW person , and .cW person is a class. Support for attributes of complex types will be reintroduced in a future release of \*(PG. .sh 2 "Sets" .pp \*(PG now provides limited support for sets. Currently this comes via results of \*(PQ functions (C functions should also be able to return a set of values; this will be available in a future release). The key design choice to point out is that when two set-valued \*(PQ functions appear in the target list of a .cW retrieve query, the result will be a set of .q flattened tuples. This set of tuples is the cross product of all the sets appearing the target list. For example, if you have two functions, .cW f and .cW g , where .cW f returns 3 results and .cW g returns 2, \*(PG will return 6 tuples which make up all combinations of .cW f and .cW g . If either .cW f or .cW g retuns no results (i.e. the empty set) then we consider it to be a set of 1 element whose value is NULL. This choice was made primarily to avoid returning no results when a function in the target list returns nothing. .sh 2 "Large Objects and the Inversion File System" .pp Support for large objects in \*(PG has been improved. \*(vP supported large objects stored in \*(uX files. User applications could open, seek, read, and write these large objects, but only inside dynamically-loaded functions. In addition, changes to large objects were not transaction-protected, and no support for historical access was available. .pp In \*(vC, another large object implementation is provided. This implementation breaks large objects into .q chunks, and stores each chunk in a tuple in the database. Updates are transaction-protected and time travel is available. \*(vP large objects (\c .q "\*(uX large objects" ) are still supported. The new implementation (\c .q "Inversion large objects" ) is available by specifying the proper flags when an object is created. Details are provided in the \*(rM. .pp In addition, a rudimentary file system has been built on top of the \*(PG Inversion large object implementation. The Inversion file system provides transaction-protected access to user files, time travel on file system state, and the ability to do attribute- or content-based searches for file data. .pp At present, no kernel interface to Inversion is available, so the Inversion file system cannot be mounted and used in the same way as the native file system. Instead, a suite of library routines and utility programs give users access to the Inversion file system. Again, see the \*(rM for details. .sh 2 "Indices on System Catalogs" .pp \*(PG now has secondary indices defined on the system catalogs. Initially, we have indexed .cW pg_proc , .cW pg_attribute , and .cW pg_type . We expect that, after profiling \*(PG performance on large databases, additional indices will be added in future releases. .sh 1 "Miscellaneous" .sh 2 "Big Bug Fixes" .pp We have found and fixed a number of serious bugs with multi-user operation that were present in release 3.1. One bug sometimes caused a backend to read end-of-file from the socket on start up. Another much more destructive bug caused data from one database to be written to another database in certain circumstances. If the database being written to was .cW template1 , then the corruption would be passed on to whoever ran a subsequent .cW createdb . Often .cW createdb would just fail. .sh 2 "\*(rM and \*(uM" .pp A serious effort was made to improve the dilapidated condition of both the \*(rM and \*(uM. The main focus was to root out all of the lies they contained, as well as documenting all of the new features. We will be paying much closer attention to bugs in these two documents. If you find something wrong in them, or something you can't understand, let us know about it .cW bug-postgres@postgres.Berkeley.EDU ). ( .sh 2 "\*(PG User Ids and Unix UIDs" .pp The user ID of a \*(PG registered user .b must match the user's \*(uX user ID. In the new release, the user ID of the \*(PG user in .cW /etc/passwd is .b not presumed to be anything. We now adjust the system catalog entry for the user ID at installation time. It will happen automatically; there is no longer any need to edit .cW pg_user.h . .sh 2 "Security" .pp Security in \*(PG is pretty much non-existent. We are working on providing it for a future release. For now the only check \*(PG performs is at initialization time. The backend will lookup the front-end user to make sure s/he is a registered \*(PG user before allowing the user to run any queries. Just so you are aware, it is not at all difficult for someone to circumvent this poor excuse for a lock-out mechanism. If you really care about your data, you should make backups of your .cW $POSTGRESHOME/data directory regularly. .lp In previous releases, .cW pg_user contained entries for each of the \*(PG implementors. In \*(vC, the only entry is for the user named .cW postgres . .sh 2 "Append Returns an Object Id" .pp When you run the \*(PQ .cW append command from .cW pqexec , the command tag that you receive has the .cW oid of the appended tuple in it. When you run .cW append queries from the monitor you get output something like: .(C APPEND 206557 .)C When two or more tuples are appended by the same command \*(PG returns the invalid object ID zero. .sh 1 "Known Bugs" .pp There are a few known bugs that we did not fix in the current release. .sh 2 "Indices and the Instance Level Rule System" .pp The instance-level rule system essentially ignores indices, so if you are defining a rule on an indexed attribute, you should use the query rewrite rule system. .sh 2 "Retrieve Into and failed backends" .pp If a backend fails while in the course of executing a .cW "retrieve into" query, a spurious file, with the same name as the target class of the .cW "retrieve into" , will be left in the database directory. This file can be safely deleted by the database administrator. .sh 2 "Known bugs list" .pp A list of known bugs and suggested work-arounds can be anonymously FTP'd from .cW postgres.Berkeley.EDU (128.32.149.1). This list is kept in the file .cW pub/postgres-v4r0.bugs . We will make every attempt to keep this list up to date. .sh 1 "Machine-dependent Problems" .sh 2 "SPARCstations running SunOS 4.0.3" .pp \*(PG has been known to crash SunOS 4.0.3 on SPARCstations, due to a SunOS bug in shared memory. This bug has not been observed on SunOS 4.1 and higher, so any reports of crashes on SunOS 4.1 and higher are especially appreciated.