diff --git a/doc/src/sgml/admin.sgml b/doc/src/sgml/admin.sgml index 4c33426a9d9f1efde909ed70b292d8ac58f016bd..b69d9f759f1e8e1879975ba6b721077acd8bd8fa 100644 --- a/doc/src/sgml/admin.sgml +++ b/doc/src/sgml/admin.sgml @@ -1,11 +1,18 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/Attic/admin.sgml,v 1.19 2000/03/28 14:16:06 thomas Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/Attic/admin.sgml,v 1.20 2000/03/30 22:22:40 thomas Exp $ Postgres Administrator's Guide. Derived from postgres.sgml. - thomas 1998-10-27 $Log: admin.sgml,v $ +Revision 1.20 2000/03/30 22:22:40 thomas +Accumulated fixups. +Add some chapters on new topics. +Change to referencing OASIS/Docbook v3.1 rather than Davenport/Docbook v3.0 +Grepped for and fixed apparent tag mangling from emacs + "Normalize" operation. Should be the last of those. + Revision 1.19 2000/03/28 14:16:06 thomas Update SGML catalog references to DocBook 3.1 on FreeBSD. Matches postgresql.org/hub.org environment. @@ -34,6 +41,7 @@ Clean out duplicate stuff in odbc.sgml resulting from a faulty patch. <!entity info SYSTEM "info.sgml"> <!entity legal SYSTEM "legal.sgml"> <!entity notation SYSTEM "notation.sgml"> +<!entity problems SYSTEM "problems.sgml"> <!entity y2k SYSTEM "y2k.sgml"> <!entity config SYSTEM "config.sgml"> diff --git a/doc/src/sgml/advanced.sgml b/doc/src/sgml/advanced.sgml index 8a5e61210687fc923461b8346e09491250bce8b8..eb60f91c7a4aa778a4fe9eb0e25050718b06baf9 100644 --- a/doc/src/sgml/advanced.sgml +++ b/doc/src/sgml/advanced.sgml @@ -3,7 +3,7 @@ <para> Having covered the basics of using - <productname>e>Postgr</productname>e> <acronym>SQL</acronym> to + <productname>Postgres</productname> <acronym>SQL</acronym> to access your data, we will now discuss those features of <productname>Postgres</productname> that distinguish it from conventional data managers. These features include inheritance, time @@ -103,7 +103,7 @@ SELECT c.name, c.altitude be run over cities and all classes below cities in the inheritance hierarchy. Many of the commands that we have already discussed (<command>select</command>, - <command>and>up</command>and> and <command>delete</command>) + <command>update</command> and <command>delete</command>) support this <quote>*</quote> notation, as do others, like <command>alter</command>. </para> diff --git a/doc/src/sgml/bug-reporting.sgml b/doc/src/sgml/bug-reporting.sgml deleted file mode 100644 index 2360fe64a337bc7173afe662b30a32f989c452ac..0000000000000000000000000000000000000000 --- a/doc/src/sgml/bug-reporting.sgml +++ /dev/null @@ -1,296 +0,0 @@ -<Sect1> - <title>Bug Reporting Guidelines</title> - - <para> - When you encounter a bug in <productname>PostgreSQL</productname> we want to - hear about it. Your bug reports are an important part in making - <productname>PostgreSQL</productname> more reliable because even the utmost - care cannot guarantee that every part of PostgreSQL will work on every - platform under every circumstance. - </para> - - <para> - The following suggestions are intended to assist you in forming bug reports - that can be handled in an effective fashion. No one is required to follow - them but it tends to be to everyone's advantage. - </para> - - <para> - We cannot promise to fix every bug right away. If the bug is obvious, critical, - or affects a lot of users, chances are good that someone will look into it. It - could also happen that we tell you to update to a newer version to see if the - bug happens there. Or we might decide that the bug - cannot be fixed before some major rewrite we might be planning is done. Or - perhaps it's simply too hard and there are more important things on the agenda. - If you need help immediately, consider obtaining a commercial support contract. - </para> - - <Sect2> - <title>Identifying Bugs</title> - - <para> - Before you ask <quote>Is this a bug?</quote>, please read and re-read the - documentation to verify that you can really do whatever it is you are - trying. If it is not clear from the documentation whether you can do - something or not, please report that too, it's a bug in the documentation. - If it turns out that the program does something different from what the - documentation says, that's a bug. That might include, but is not limited to, - the following circumstances: - - <itemizedlist> - <listitem> - <para> - A program terminates with a fatal signal or an operating system - error message that would point to a problem in the program (for - example not <quote>disk full</quote>). - </para> - </listitem> - - <listitem> - <para> - A program produces the wrong output for any given input. - </para> - </listitem> - - <listitem> - <para> - A program refuses to accept valid input. - </para> - </listitem> - - <listitem> - <para> - A program accepts invalid input without a notice or error message. - </para> - </listitem> - - <listitem> - <para> - <productname>PostgreSQL</productname> fails to compile, build, or - install according to the instructions on supported platforms. - </para> - </listitem> - </itemizedlist> - - Here <quote>program</quote> refers to any executable, not only the backend server. - </para> - - <para> - Being slow or resource-hogging is not necessarily a bug. Read the documentation - or ask on one of the mailing lists for help in tuning your applications. Failing - to comply to <acronym>SQL</acronym> is not a bug unless compliance for the - specific feature is explicitly claimed. - </para> - - <para> - Before you continue, check on the TODO list and in the FAQ to see if your bug is - already known. If you can't decode the information on the TODO list, report your - problem. The least we can do is make the TODO list clearer. - </para> - </Sect2> - - <Sect2> - <title>What to report</title> - - <para> - The most important thing to remember about bug reporting is to state all - the facts and only facts. Do not speculate what you think went wrong, what - <quote>it seemed to do</quote>, or which part of the program has a fault. - If you are not familiar with the implementation you would probably guess - wrong and not help us a bit. And even if you are, educated explanations are - a great supplement to but no substitute for facts. If we are going to fix - the bug we still have to see it happen for ourselves first. - Reporting the bare facts - is relatively straightforward (you can probably copy and paste them from the - screen) but all too often important details are left out because someone - thought it doesn't matter or the report would <quote>ring a bell</quote> - anyway. - </para> - - <para> - The following items should be contained in every bug report: - - <itemizedlist> - <listitem> - <para> - The exact sequence of steps <emphasis>from program startup</emphasis> - necessary to reproduce the problem. This should be self-contained; - it is not enough to send in a bare select statement without the - preceeding create table and insert statements, if the output should - depend on the data in the tables. We do not have the time - to decode your database schema, and if we are supposed to make up - our own data we would probably miss the problem. - The best format for a test case for - query-language related problems is a file that can be run through the - <application>psql</application> frontend - that shows the problem. (Be sure to not have anything in your - <filename>~/.psqlrc</filename> startup file.) You are encouraged to - minimize the size of your example, but this is not absolutely necessary. - If the bug is reproduceable, we'll find it either way. - </para> - <para> - If your application uses some other client interface, such as PHP, then - please try to isolate the offending queries. We probably won't set up a - web server to reproduce your problem. In any case remember to provide - the exact input files, do not guess that the problem happens for - <quote>large files</quote> or <quote>mid-size databases</quote>, etc. - </para> - </listitem> - - <listitem> - <para> - The output you got. Please do not say that it <quote>didn't work</quote> or - <quote>failed</quote>. If there is an error message, - show it, even if you don't understand it. If the program terminates with - an operating system error, say which. If nothing at all happens, say so. - Even if the result of your test case is a program crash or otherwise obvious - it might not happen on our platform. The easiest thing is to copy the output - from the terminal, if possible. - </para> - <note> - <para> - In case of fatal errors, the error message provided by the client might - not contain all the information available. In that case, also look at the - output of the database server. If you do not keep your server output, - this would be a good time to start doing so. - </para> - </note> - </listitem> - - <listitem> - <para> - The output you expected is very important to state. If you just write - <quote>This command gives me that output.</quote> or <quote>This is not - what I expected.</quote>, we might run it ourselves, scan the output, and - think it looks okay and is exactly what we expected. We shouldn't have to - spend the time to decode the exact semantics behind your commands. - Especially refrain from merely saying that <quote>This is not what SQL says/Oracle - does.</quote> Digging out the correct behavior from <acronym>SQL</acronym> - is not a fun undertaking, nor do we all know how all the other relational - databases out there behave. (If your problem is a program crash you can - obviously omit this item.) - </para> - </listitem> - - <listitem> - <para> - Any command line options and other startup options, including concerned - environment variables or configuration files that you changed from the - default. Again, be exact. If you are using a pre-packaged - distribution that starts the database server at boot time, you should try - to find out how that is done. - </para> - </listitem> - - <listitem> - <para> - Anything you did at all differently from the installation instructions. - </para> - </listitem> - - <listitem> - <para> - The PostgreSQL version. You can run the command - <literal>SELECT version();</literal> to - find out. If this function does not exist, say so, then we know that - your version is old enough. If you can't start up the server or a - client, look into the README file in the source directory or at the - name of your distribution file or package name. If your version is older - than 6.5 we will almost certainly tell you to upgrade. There are tons - of bugs in old versions, that's why we write new ones. - </para> - <para> - If you run a pre-packaged version, such as RPMs, say so, including any - subversion the package may have. If you are talking about a CVS - snapshot, mention that, including its date and time. - </para> - </listitem> - - <listitem> - <para> - Platform information. This includes the kernel name and version, C library, - processor, memory information. In most cases it is sufficient to report - the vendor and version, but do not assume everyone knows what exactly - <quote>Debian</quote> contains or that everyone runs on Pentiums. If - you have installation problems information about compilers, make, etc. - is also necessary. - </para> - </listitem> - </itemizedlist> - - Do not be afraid if your bug report becomes rather lengthy. That is a fact of life. - It's better to report everything the first time than us having to squeeze the - facts out of you. On the other hand, if your input files are huge, it is - fair to ask first whether somebody is interested in looking into it. - </para> - - <para> - Do not spend all your time to figure out which changes in the input make - the problem go away. This will probably not help solving it. If it turns - out that the bug can't be fixed right away, you will still have time to - find and share your work around. Also, once again, do not waste your time - guessing why the bug exists. We'll find that out soon enough. - </para> - - <para> - When writing a bug report, please choose non-confusing terminology. - The software package as such is called <quote>PostgreSQL</quote>, - sometimes <quote>Postgres</quote> for short. (Sometimes - the abbreviation <quote>Pgsql</quote> is used but don't do that.) When you - are specifically talking about the backend server, mention that, don't - just say <quote>Postgres crashes</quote>. The interactive frontend is called - <quote>psql</quote> and is for all intends and purposes completely separate - from the backend. - </para> - </Sect2> - - <Sect2> - <title>Where to report bugs</title> - - <para> - In general, send bug reports to <pgsql-bugs@postgresql.org>. You are - invited to find a descriptive subject for your email message, perhaps parts - of the error message. - </para> - - <para> - Do not send bug reports to any of the user mailing lists, such as - pgsql-sql or pgsql-general. These mailing lists are for answering - user questions, their subscribers normally do not wish to receive - bug reports. More importantly, they are unlikely to fix them. - </para> - - <para> - Also, please do <emphasis>not</emphasis> send reports to - <pgsql-hackers@postgresql.org>. This list is for discussing the - development of <productname>PostgreSQL</productname>, it would be nice - if we could keep the bug reports separate. We might choose take up a - discussion - about your bug report on it, if the bug needs more review. - </para> - - <para> - If you have a problem with the documentation, send email to - <pgsql-docs@postgresql.org>. Refer to the document, chapter, and sections. - </para> - - <para> - If your bug is a portability problem on a non-supported platform, send - mail to <pgsql-ports@postgresql.org>, so we (and you) can work on - porting <productname>PostgreSQL</productname> to your platform. - </para> - - <note> - <para> - Due to the unfortunate amount of spam going around, all of the above - email addresses are closed mailing lists. That is, you need to be - subscribed to them in order to be allowed to post. If you simply - want to send mail but do not want to receive list traffic, you can - subscribe to the special pgsql-loophole <quote>list</quote>, which - allows you to post to all <productname>PostgreSQL</productname> - mailing lists without receiving any messages. Send email to - <pgsql-loophole-request@postgresql.org> to subscribe. - </para> - </note> - </Sect2> -</Sect1> diff --git a/doc/src/sgml/ecpg.sgml b/doc/src/sgml/ecpg.sgml index 7f0f785d4b686d01262f8d6cdae85fb6e4879c0b..75ef0b128c5f5fb538ab869167342527ef83d7ca 100644 --- a/doc/src/sgml/ecpg.sgml +++ b/doc/src/sgml/ecpg.sgml @@ -1,180 +1,182 @@ -<Chapter Id="ecpg"> -<DocInfo> -<AuthorGroup> -<Author> -<FirstName>Linus</FirstName> -<Surname>Tolke</Surname> -</Author> -<Author> -<FirstName>Michael</FirstName> -<Surname>Meskes</Surname> -</Author> -</AuthorGroup> -<Copyright> -<Year>1996-1997</Year> -<Holder>Linus Tolke</Holder> -</Copyright> -<Copyright> -<Year>1998</Year> -<Holder>Michael Meskes</Holder> -</Copyright> -<Date>Transcribed 1998-02-12</Date> -</DocInfo> - -<Title><Application>ecpg</Application> - Embedded <Acronym>SQL</Acronym> -in <Acronym>C</Acronym></Title> - -<Para> -This describes an embedded <Acronym>SQL</Acronym> in <Acronym>C</Acronym> -package for <ProductName>Postgres</ProductName>. - -It is written by <ULink url="mailto:linus@epact.se">Linus Tolke</ULink> -and <ULink url="mailto:meskes@postgresql.org">Michael Meskes</ULink>. - -<Note> -<Para> -Permission is granted to copy and use in the same way as you are allowed -to copy and use the rest of the <ProductName>PostgreSQL</ProductName>. -</Para> -</Note> -</para> -<Sect1> -<Title>Why Embedded <Acronym>SQL</Acronym>?</Title> - -<Para> -Embedded <Acronym>SQL</Acronym> has some small advantages over other ways -to handle <Acronym>SQL</Acronym> -queries. It takes care of all the tedious moving of information to and -from variables in your <Acronym>C</Acronym> program. -Many <Acronym>RDBMS</Acronym> packages -support this embedded language. -</Para> - -<Para> There is an ANSI-standard describing how the embedded language should -work. <Application>ecpg</Application> was designed to meet this standard -as much as possible. So it is -possible to port programs with embedded <Acronym>SQL</Acronym> written for -other <Acronym>RDBMS</Acronym> packages to -<ProductName>Postgres</ProductName> and thus promoting the spirit of free -software. -</Para> -</sect1> -<Sect1> -<Title>The Concept</Title> - -<Para> -You write your program in <Acronym>C</Acronym> with some -special <Acronym>SQL</Acronym> things. -For declaring variables that can be used in -<Acronym>SQL</Acronym> statements you need to -put them in a special declare section. -You use a special syntax for the <Acronym>SQL</Acronym> queries. -</Para> - -<Para> -Before compiling you run the file through -the embedded <Acronym>SQL</Acronym> <Acronym>C</Acronym> -preprocessor and it converts the <Acronym>SQL</Acronym> statements you used -to function -calls with the variables used as arguments. Both variables that are used -as input to the <Acronym>SQL</Acronym> statements and variables that will -contain the -result are passed. -</Para> - -<Para> -Then you compile and at link time you link with a special library that -contains the functions used. These functions (actually it is mostly one -single function) fetches the information from the arguments, performs -the <Acronym>SQL</Acronym> query using the ordinary interface -(<FileName>libpq</FileName>) and puts back -the result in the arguments dedicated for output. -</Para> - -<Para> -Then you run your program and when the control arrives to -the <Acronym>SQL</Acronym> -statement the <Acronym>SQL</Acronym> statement is performed against -the database and you -can continue with the result. -</Para> -</sect1> - -<Sect1> -<Title>How To Use <Application>egpc</Application></Title> - -<Para> -This section describes how to use the <Application>egpc</Application> tool. -</Para> - -<Sect2> -<Title>Preprocessor</title> - -<Para> -The preprocessor is called <Application>ecpg</Application>. -After installation it resides in -the <ProductName>Postgres</ProductName> <FileName>bin/</FileName> directory. -</Para> -</sect2> -<Sect2> -<Title>Library</title> - -<Para> -The <Application>ecpg</Application> library is called -<FileName>libecpg.a</FileName> or -<FileName>libecpg.so</FileName>. Additionally, the library -uses the <FileName>libpq</FileName> library for communication to the -<ProductName>Postgres</ProductName> server so you will -have to link your program with <Parameter>-lecpg -lpq</Parameter>. -</Para> - -<Para> -The library has some methods that are "hidden" but that could prove very -useful sometime. - -<itemizedlist> -<listitem> -<para> -<function>ECPGdebug(int <replaceable class="parameter">on</replaceable>, FILE *<replaceable class="parameter">stream</replaceable>)</function> -turns on debug logging if called with the first argument non-zero. -Debug logging is done on <replaceable class="parameter">stream</replaceable>. - Most <Acronym>SQL</Acronym> statement logs its arguments and result. -</Para> - -<Para> -The most important one (<Function>ECPGdo</Function>) -that is called on almost all <Acronym>SQL</Acronym> -statements logs both its expanded string, - i.e. the string -with all the input variables inserted, and the result from the -<ProductName>Postgres</ProductName> server. - This can be very useful when searching for errors -in your <Acronym>SQL</Acronym> statements. -</Para> -</ListItem> - -<listitem> -<para> -<function>ECPGstatus()</function> -This method returns TRUE if we are connected to a database and FALSE if not. -</Para> -</ListItem> -</itemizedlist> -</Para> -</sect2> - -<Sect2> -<Title>Error handling</title> - -<Para> -To be able to detect errors from the <ProductName>Postgres</ProductName> -server you include a line like -<ProgramListing> -exec sql include sqlca; -</ProgramListing> -in the include section of your file. This will define a struct and a -variable with the name <Parameter>sqlca</Parameter> as following: -<ProgramListing> + <chapter> + <docinfo> + <authorgroup> + <author> + <firstname>Linus</firstname> + <surname>Tolke</surname> + </author> + <author> + <firstname>Michael</firstname> + <surname>Meskes</surname> + </author> + </authorgroup> + <copyright> + <year>1996-1997</year> + <holder>Linus Tolke</holder> + </copyright> + <copyright> + <year>1998</year> + <holder>Michael Meskes</holder> + </copyright> + <date>Transcribed 1998-02-12</date> + </docinfo> + + <title><application>ecpg</application> - Embedded <acronym>SQL</acronym> + in <acronym>C</acronym></title> + + <para> + This describes an embedded <acronym>SQL</acronym> in <acronym>C</acronym> + package for <productname>Postgres</productname>. + + It is written by <ulink url="">Linus Tolke</ulink> + and <ulink url="">Michael Meskes</ulink>. + + <note> + <para> + Permission is granted to copy and use in the same way as you are allowed + to copy and use the rest of the <productname>PostgreSQL</productname>. + </para> + </note> + </para> + <sect1> + <title>Why Embedded <acronym>SQL</acronym>?</title> + + <para> + Embedded <acronym>SQL</acronym> has some small advantages over other ways + to handle <acronym>SQL</acronym> + queries. It takes care of all the tedious moving of information to and + from variables in your <acronym>C</acronym> program. + Many <acronym>RDBMS</acronym> packages + support this embedded language. + </para> + + <para> There is an ANSI-standard describing how the embedded language should + work. <application>ecpg</application> was designed to meet this standard + as much as possible. So it is + possible to port programs with embedded <acronym>SQL</acronym> written for + other <acronym>RDBMS</acronym> packages to + <productname>Postgres</productname> and thus promoting the spirit of free + software. + </para> + </sect1> + + <sect1> + <title>The Concept</title> + + <para> + You write your program in <acronym>C</acronym> with some + special <acronym>SQL</acronym> things. + For declaring variables that can be used in + <acronym>SQL</acronym> statements you need to + put them in a special declare section. + You use a special syntax for the <acronym>SQL</acronym> queries. + </para> + + <para> + Before compiling you run the file through + the embedded <acronym>SQL</acronym> <acronym>C</acronym> + preprocessor and it converts the <acronym>SQL</acronym> statements you used + to function + calls with the variables used as arguments. Both variables that are used + as input to the <acronym>SQL</acronym> statements and variables that will + contain the + result are passed. + </para> + + <para> + Then you compile and at link time you link with a special library that + contains the functions used. These functions (actually it is mostly one + single function) fetches the information from the arguments, performs + the <acronym>SQL</acronym> query using the ordinary interface + (<filename>libpq</filename>) and puts back + the result in the arguments dedicated for output. + </para> + + <para> + Then you run your program and when the control arrives to + the <acronym>SQL</acronym> + statement the <acronym>SQL</acronym> statement is performed against + the database and you + can continue with the result. + </para> + </sect1> + + <sect1> + <title>How To Use <application>ecpg</application></title> + + <para> + This section describes how to use the <application>ecpg</application> tool. + </para> + + <sect2> + <title>Preprocessor</title> + + <para> + The preprocessor is called <application>ecpg</application>. + After installation it resides in + the <productname>Postgres</productname> <filename>bin/</filename> directory. + </para> + </sect2> + <sect2> + <title>Library</title> + + <para> + The <application>ecpg</application> library is called + <filename>libecpg.a</filename> or + <filename>libecpg.so</filename>. Additionally, the library + uses the <filename>libpq</filename> library for communication to the + <productname>Postgres</productname> server so you will + have to link your program with <parameter>-lecpg -lpq</parameter>. + </para> + + <para> + The library has some methods that are "hidden" but that could prove very + useful sometime. + + <itemizedlist> + <listitem> + <para> + <function>ECPGdebug(int <replaceable>on</replaceable>, FILE + *<replaceable>stream</replaceable>)</function> + turns on debug logging if called with the first argument non-zero. + Debug logging is done on <replaceable>stream</replaceable>. + Most <acronym>SQL</acronym> statement logs its arguments and result. + </para> + + <para> + The most important one (<function>ECPGdo</function>) + that is called on almost all <acronym>SQL</acronym> + statements logs both its expanded string, + i.e. the string + with all the input variables inserted, and the result from the + <productname>Postgres</productname> server. + This can be very useful when searching for errors + in your <acronym>SQL</acronym> statements. + </para> + </listitem> + + <listitem> + <para> + <function>ECPGstatus()</function> + This method returns TRUE if we are connected to a database and FALSE if not. + </para> + </listitem> + </itemizedlist> + </para> + </sect2> + + <sect2> + <title>Error handling</title> + + <para> + To be able to detect errors from the <productname>Postgres</productname> + server you include a line like + <programlisting> + exec sql include sqlca; + </programlisting> + in the include section of your file. This will define a struct and a + variable with the name <parameter>sqlca</parameter> as following: + <programlisting> struct sqlca { char sqlcaid[8]; @@ -207,702 +209,712 @@ struct sqlca /* 7: empty */ char sqlext[8]; } sqlca; -</ProgramListing> -</Para> - -<Para> -If an error occured in the last <Acronym>SQL</Acronym> statement -then <Parameter>sqlca.sqlcode</Parameter> -will be non-zero. If <Parameter>sqlca.sqlcode</Parameter> is less that 0 - then this is -some kind of serious error, like the database definition does not match -the query given. If it is bigger than 0 then this is a normal error like -the table did not contain the requested row. -</Para> - -<Para> -sqlca.sqlerrm.sqlerrmc will contain a string that describes the error. -The string ends with the line number -in the source file. -</Para> - -<Para> -List of errors that can occur: - -<VariableList> -<VarListEntry> -<Term>-12, Out of memory in line %d.</Term> -<ListItem> -<Para> -Does not normally occur. This is a sign that your virtual memory is -exhausted. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>-200, Unsupported type %s on line %d.</Term> -<ListItem> -<Para> -Does not normally occur. This is a sign that the preprocessor has -generated something that the library does not know about. Perhaps you -are running incompatible versions of the preprocessor and the library. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>-201, Too many arguments line %d.</Term> -<ListItem> -<Para> -This means that <ProductName>Postgres</ProductName> has returned more -arguments than we have -matching variables. Perhaps you have forgotten a couple of the host -variables in the <Command>INTO :var1,:var2</Command>-list. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>-202, Too few arguments line %d.</Term> -<ListItem> -<Para> -This means that <ProductName>Postgres</ProductName> has returned fewer -arguments than we have -host variables. Perhaps you have too many host variables in the -<Command>INTO :var1,:var2</Command>-list. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>-203, Too many matches line %d.</Term> -<ListItem> -<Para> -This means that the query has returned several lines but the -variables specified are no arrays. The <Command>SELECT</Command> you made -probably was not unique. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>-204, Not correctly formatted int type: %s line %d.</Term> -<ListItem> -<Para> -This means that the host variable is of an <Type>int</Type> type and the field -in the <ProductName>Postgres</ProductName> database is of another type and -contains a value that cannot be interpreted as an <Type>int</Type>. -The library uses <Function>strtol</Function> -for this conversion. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>-205, Not correctly formatted unsigned type: %s line %d.</Term> -<ListItem> -<Para> -This means that the host variable is of an <Type>unsigned int</Type> type and -the field in the <ProductName>Postgres</ProductName> database is of another -type and contains a -value that cannot be interpreted as an <Type>unsigned int</Type>. The library -uses <Function>strtoul</Function> for this conversion. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>-206, Not correctly formatted floating point type: %s line %d.</Term> -<ListItem> -<Para> -This means that the host variable is of a <Type>float</Type> type and -the field in the <ProductName>Postgres</ProductName> database is of another -type and contains a -value that cannot be interpreted as an <Type>float</Type>. The library -uses <Function>strtod</Function> for this conversion. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>-207, Unable to convert %s to bool on line %d.</Term> -<ListItem> -<Para> -This means that the host variable is of a <Type>bool</Type> type and -the field in the <ProductName>Postgres</ProductName> database is neither 't' -nor 'f'. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>-208, Empty query line %d.</Term> -<ListItem> -<Para> -<ProductName>Postgres</ProductName> returned PGRES_EMPTY_QUERY, probably -because the query indeed was empty. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>-220, No such connection %s in line %d.</Term> -<ListItem> -<Para> -The program tries to access a connection that does not exist. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>-221, Not connected in line %d.</Term> -<ListItem> -<Para> -The program tries to access a connection that does exist but is not open. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>-230, Invalid statement name %s in line %d.</Term> -<ListItem> -<Para> -The statement you are trying to use has not been prepared. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>-400, Postgres error: %s line %d.</Term> -<ListItem> -<Para> -Some <ProductName>Postgres</ProductName> error. -The message contains the error message from the -<ProductName>Postgres</ProductName> backend. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>-401, Error in transaction processing line %d. </Term> -<ListItem> -<Para> -<ProductName>Postgres</ProductName> signalled to us that we cannot start, -commit or rollback the transaction. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>-402, connect: could not open database %s.</Term> -<ListItem> -<Para> -The connect to the database did not work. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>100, Data not found line %d.</Term> -<ListItem> -<Para> -This is a "normal" error that tells you that what you are quering cannot -be found or we have gone through the cursor. -</Para> -</ListItem> -</VarListEntry> - -</VariableList> -</Para> -</Sect2> -</sect1> - -<Sect1> -<Title>Limitations</Title> - -<Para> -What will never be included and why or what cannot be done with this -concept. - -<VariableList> -<VarListEntry> -<Term>oracles single tasking possibility</Term> -<ListItem> -<Para> -Oracle version 7.0 on AIX 3 uses the OS-supported locks on the shared -memory segments and allows the application designer to link an -application in a so called single tasking way. Instead of starting one -client process per application process both the database part and the -application part is run in the same process. In later versions of oracle -this is no longer supported. -</Para> - -<Para> -This would require a total redesign of the <ProductName>Postgres</ProductName> access model and -that effort can not justify the performance gained. -</Para> -</ListItem> -</VarListEntry> -</VariableList> -</Para> -</sect1> - -<Sect1> -<Title>Porting From Other <Acronym>RDBMS</Acronym> Packages</Title> - -<Para> -The design of <Application>ecpg</Application> follows SQL standard. So -porting from a standard RDBMS should not be a problem. Unfortunately there -is no such thing as a standard RDBMS. So <Application>ecpg</Application> -also tries to understand syntax additions as long as they do not create -conflicts with the standard. -</Para> - -<Para> -The following list shows all the known incompatibilities. If you find one -not listed please notify <ULink url="mailto:meskes@postgresql.org">Michael -Meskes</ULink>. Note, however, that we list only incompatibilities from -a precompiler of another RDBMS to <Application>ecpg</Application> and not -additional <Application>ecpg</Application> features that these RDBMS do not -have. -</Para> - -<Para> -<VariableList> -<VarListEntry> -<Term>Syntax of FETCH command</Term> -<ListItem> -<Para> -The standard syntax of the FETCH command is: -</para> -<Para> -FETCH [direction] [amount] IN|FROM <Replaceable>cursor name</Replaceable>. -</Para> -<para> -<Application>ORACLE</Application>, however, does not use the keywords IN -resp. FROM. This feature cannot be added since it would create parsing -conflicts. -</Para> -</ListItem> -</VarListEntry> -</VariableList> -</Para> -</sect1> - -<Sect1> -<Title>Installation</Title> - -<Para> -Since version 0.5 <Application>ecpg</Application> is distributed -together with <ProductName>Postgres</ProductName>. So you -should get your precompiler, libraries and header files compiled and -installed by default as a part of your installation. -</Para> -</sect1> - -<Sect1> -<Title>For the Developer</Title> - -<Para> -This section is for those who want to develop the -<Application>ecpg</Application> interface. It -describes how the things work. The ambition is to make this section -contain things for those that want to have a look inside and the section -on How to use it should be enough for all normal questions. - -So, read this before looking at the internals of the -<Application>ecpg</Application>. If -you are not interested in how it really works, skip this section. -</Para> - -<Sect2> -<Title>ToDo List</Title> - -<Para> -This version the preprocessor has some flaws: - -<VariableList> -<VarListEntry> -<Term>Library functions</Term> -<ListItem> -<Para> -to_date et al. do not exists. But then <ProductName>Postgres</ProductName> -has some good conversion routines itself. So you probably won't miss these. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>Structures ans unions</Term> -<ListItem> -<Para> -Structures and unions have to be defined in the declare section. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>Missing statements</Term> -<ListItem> -<Para> -The following statements are not implemented thus far: -<VariableList> -<VarListEntry> -<Term> exec sql allocate</Term> -<ListItem> -<Para> -</Para> -</listitem> -</VarListEntry> -<VarListEntry> -<Term> exec sql deallocate</Term> -<ListItem> -<Para> -</Para> -</listitem> -</VarListEntry> -<VarListEntry> -<Term> SQLSTATE</Term> -<ListItem> -<Para> -</Para> -</listitem> -</VarListEntry> -</VariableList> -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>message 'no data found'</Term> -<ListItem> -<Para> -The error message for "no data" in an exec sql insert select from statement -has to be 100. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>sqlwarn[6]</Term> -<ListItem> -<Para> -sqlwarn[6] should be 'W' if the PRECISION or SCALE value specified in a SET -DESCRIPTOR statement will be ignored. -</Para> -</ListItem> -</VarListEntry> -</VariableList> -</Para> -</sect2> - -<Sect2> -<Title>The Preprocessor</Title> - -<Para> -The first four lines written to the output are constant additions by ecpg. -These are two comments and two include lines necessary for the interface to the -library. -</Para> - -<Para> -Then the preprocessor works in one pass only, reading the input file and -writing to the output as it goes along. Normally it just echoes -everything to the output without looking at it further. -</Para> - -<Para> -When it comes to an <Command>EXEC SQL</Command> statements it intervenes and -changes them depending on what it is. -The <Command>EXEC SQL</Command> statement can be one of these: - -<VariableList> -<VarListEntry> -<Term>Declare sections</Term> -<ListItem> -<Para> -Declare sections begins with -<ProgramListing> + </programlisting> + </para> + + <para> + If an error occured in the last <acronym>SQL</acronym> statement + then <parameter>sqlca.sqlcode</parameter> + will be non-zero. If <parameter>sqlca.sqlcode</parameter> is less that 0 + then this is + some kind of serious error, like the database definition does not match + the query given. If it is bigger than 0 then this is a normal error like + the table did not contain the requested row. + </para> + + <para> + sqlca.sqlerrm.sqlerrmc will contain a string that describes the error. + The string ends with the line number + in the source file. + </para> + + <para> + List of errors that can occur: + + <variablelist> + <varlistentry> + <term>-12, Out of memory in line %d.</term> + <listitem> + <para> + Does not normally occur. This is a sign that your virtual memory is + exhausted. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-200, Unsupported type %s on line %d.</term> + <listitem> + <para> + Does not normally occur. This is a sign that the preprocessor has + generated something that the library does not know about. Perhaps you + are running incompatible versions of the preprocessor and the library. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-201, Too many arguments line %d.</term> + <listitem> + <para> + This means that <productname>Postgres</productname> has returned more + arguments than we have + matching variables. Perhaps you have forgotten a couple of the host + variables in the <command>INTO :var1,:var2</command>-list. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-202, Too few arguments line %d.</term> + <listitem> + <para> + This means that <productname>Postgres</productname> has returned fewer + arguments than we have + host variables. Perhaps you have too many host variables in the + <command>INTO :var1,:var2</command>-list. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-203, Too many matches line %d.</term> + <listitem> + <para> + This means that the query has returned several lines but the + variables specified are no arrays. The <command>SELECT</command> you made + probably was not unique. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-204, Not correctly formatted int type: %s line %d.</term> + <listitem> + <para> + This means that the host variable is of an <type>int</type> type and the field + in the <productname>Postgres</productname> database is of another type and + contains a value that cannot be interpreted as an <type>int</type>. + The library uses <function>strtol</function> + for this conversion. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-205, Not correctly formatted unsigned type: %s line %d.</term> + <listitem> + <para> + This means that the host variable is of an <type>unsigned int</type> type and + the field in the <productname>Postgres</productname> database is of another + type and contains a + value that cannot be interpreted as an <type>unsigned int</type>. The library + uses <function>strtoul</function> for this conversion. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-206, Not correctly formatted floating point type: %s line %d.</term> + <listitem> + <para> + This means that the host variable is of a <type>float</type> type and + the field in the <productname>Postgres</productname> database is of another + type and contains a + value that cannot be interpreted as an <type>float</type>. The library + uses <function>strtod</function> for this conversion. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-207, Unable to convert %s to bool on line %d.</term> + <listitem> + <para> + This means that the host variable is of a <type>bool</type> type and + the field in the <productname>Postgres</productname> database is neither 't' + nor 'f'. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-208, Empty query line %d.</term> + <listitem> + <para> + <productname>Postgres</productname> returned PGRES_EMPTY_QUERY, probably + because the query indeed was empty. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-220, No such connection %s in line %d.</term> + <listitem> + <para> + The program tries to access a connection that does not exist. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-221, Not connected in line %d.</term> + <listitem> + <para> + The program tries to access a connection that does exist but is not open. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-230, Invalid statement name %s in line %d.</term> + <listitem> + <para> + The statement you are trying to use has not been prepared. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-400, Postgres error: %s line %d.</term> + <listitem> + <para> + Some <productname>Postgres</productname> error. + The message contains the error message from the + <productname>Postgres</productname> backend. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-401, Error in transaction processing line %d. </term> + <listitem> + <para> + <productname>Postgres</productname> signalled to us that we cannot start, + commit or rollback the transaction. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>-402, connect: could not open database %s.</term> + <listitem> + <para> + The connect to the database did not work. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>100, Data not found line %d.</term> + <listitem> + <para> + This is a "normal" error that tells you that what you are quering cannot + be found or we have gone through the cursor. + </para> + </listitem> + </varlistentry> + + </variablelist> + </para> + </sect2> + </sect1> + + <sect1> + <title>Limitations</title> + + <abstract> + <para> + What will never be included and why or what cannot be done with this + concept. + </para> + </abstract> + + <para> + <variablelist> + <varlistentry> + <term>Oracle's single tasking possibility</term> + <listitem> + <para> + Oracle version 7.0 on AIX 3 uses the OS-supported locks on the shared + memory segments and allows the application designer to link an + application in a so called single tasking way. Instead of starting one + client process per application process both the database part and the + application part is run in the same process. In later versions of Oracle + this is no longer supported. + </para> + + <para> + This would require a total redesign of the + <productname>Postgres</productname> access model and + that effort can not justify the performance gained. + </para> + </listitem> + </varlistentry> + </variablelist> + </para> + </sect1> + + <sect1> + <title>Porting From Other <acronym>RDBMS</acronym> Packages</title> + + <para> + The design of <application>ecpg</application> follows SQL standard. So + porting from a standard RDBMS should not be a problem. Unfortunately there + is no such thing as a standard RDBMS. So <application>ecpg</application> + also tries to understand syntax additions as long as they do not create + conflicts with the standard. + </para> + + <para> + The following list shows all the known incompatibilities. If you find one + not listed please notify <ulink url="">Michael + Meskes</ulink>. Note, however, that we list only incompatibilities from + a precompiler of another RDBMS to <application>ecpg</application> and not + additional <application>ecpg</application> features that these RDBMS do not + have. + </para> + + <para> + <variablelist> + <varlistentry> + <term>Syntax of FETCH command</term> + <listitem> + <para> + The standard syntax of the FETCH command is: + </para> + <para> + FETCH [direction] [amount] IN|FROM <replaceable>cursor name</replaceable>. + </para> + <para> + <application>ORACLE</application>, however, does not use the keywords IN + resp. FROM. This feature cannot be added since it would create parsing + conflicts. + </para> + </listitem> + </varlistentry> + </variablelist> + </para> + </sect1> + + <sect1> + <title>Installation</title> + + <para> + Since version 0.5 <application>ecpg</application> is distributed + together with <productname>Postgres</productname>. So you + should get your precompiler, libraries and header files compiled and + installed by default as a part of your installation. + </para> + </sect1> + + <sect1> + <title>For the Developer</title> + + <para> + This section is for those who want to develop the + <application>ecpg</application> interface. It + describes how the things work. The ambition is to make this section + contain things for those that want to have a look inside and the section + on How to use it should be enough for all normal questions. + + So, read this before looking at the internals of the + <application>ecpg</application>. If + you are not interested in how it really works, skip this section. + </para> + + <sect2> + <title>ToDo List</title> + + <para> + This version the preprocessor has some flaws: + + <variablelist> + <varlistentry> + <term>Library functions</term> + <listitem> + <para> + to_date et al. do not exists. But then <productname>Postgres</productname> + has some good conversion routines itself. So you probably won't miss these. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>Structures ans unions</term> + <listitem> + <para> + Structures and unions have to be defined in the declare section. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>Missing statements</term> + <listitem> + <para> + The following statements are not implemented thus far: + <variablelist> + <varlistentry> + <term> exec sql allocate</term> + <listitem> + <para> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> exec sql deallocate</term> + <listitem> + <para> + </para> + </listitem> + </varlistentry> + <varlistentry> + <term> SQLSTATE</term> + <listitem> + <para> + </para> + </listitem> + </varlistentry> + </variablelist> + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>message 'no data found'</term> + <listitem> + <para> + The error message for "no data" in an exec sql insert select from statement + has to be 100. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>sqlwarn[6]</term> + <listitem> + <para> + sqlwarn[6] should be 'W' if the PRECISION or SCALE value specified in a SET + DESCRIPTOR statement will be ignored. + </para> + </listitem> + </varlistentry> + </variablelist> + </para> + </sect2> + + <sect2> + <title>The Preprocessor</title> + + <para> + The first four lines written to the output are constant additions by ecpg. + These are two comments and two include lines necessary for the interface to the + library. + </para> + + <para> + Then the preprocessor works in one pass only, reading the input file and + writing to the output as it goes along. Normally it just echoes + everything to the output without looking at it further. + </para> + + <para> + When it comes to an <command>EXEC SQL</command> statements it intervenes and + changes them depending on what it is. + The <command>EXEC SQL</command> statement can be one of these: + + <variablelist> + <varlistentry> + <term>Declare sections</term> + <listitem> + <para> + Declare sections begins with + <programlisting> exec sql begin declare section; -</ProgramListing> -and ends with -<ProgramListing> + </programlisting> + and ends with + <programlisting> exec sql end declare section; -</ProgramListing> -In the section only variable declarations are allowed. Every variable -declare within this section is also entered in a list of variables -indexed on their name together with the corresponding type. -</Para> - -<Para> -In particular the definition of a structure or union also has to be listed -inside a declare section. Otherwise <Application>ecpg</Application> cannot -handle these types since it simply does not know the definition. -</Para> - -<Para> -The declaration is echoed to the file to make the variable a normal -C-variable also. -</Para> - -<Para> -The special types VARCHAR and VARCHAR2 are converted into a named struct -for every variable. A declaration like: -<ProgramListing> + </programlisting> + In the section only variable declarations are allowed. Every variable + declare within this section is also entered in a list of variables + indexed on their name together with the corresponding type. + </para> + + <para> + In particular the definition of a structure or union also has to be listed + inside a declare section. Otherwise <application>ecpg</application> cannot + handle these types since it simply does not know the definition. + </para> + + <para> + The declaration is echoed to the file to make the variable a normal + C-variable also. + </para> + + <para> + The special types VARCHAR and VARCHAR2 are converted into a named struct + for every variable. A declaration like: + <programlisting> VARCHAR var[180]; -</ProgramListing> -is converted into -<ProgramListing> + </programlisting> + is converted into + <programlisting> struct varchar_var { int len; char arr[180]; } var; -</ProgramListing> -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>Include statements</Term> -<ListItem> -<Para> -An include statement looks like: -<ProgramListing> + </programlisting> + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>Include statements</term> + <listitem> + <para> + An include statement looks like: + <programlisting> exec sql include filename; -</ProgramListing> -Not that this is NOT the same as -<ProgramListing> + </programlisting> + Note that this is NOT the same as + <programlisting> #include <filename.h> -</ProgramListing> -</Para> - -<Para> -Instead the file specified is parsed by <Application>ecpg</Application> -itself. So the contents of the specified file is included in the resulting C -code. This way you are able to specify EXEC SQL commands in an include file. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>Connect statement</Term> -<ListItem> -<Para> -A connect statement looks like: -<ProgramListing> -exec sql connect to <Replaceable>connection target</Replaceable>; -</ProgramListing> -It creates a connection to the specified database. -</Para> - -<Para> -The <Replaceable>connection target</Replaceable> can be specified in the -following ways: -<VariableList> -<VarListEntry> -<Term>dbname[@server][:port][as <Replaceable>connection name</Replaceable>][user <Replaceable>user name</Replaceable>]</Term> -<listitem><para></para></listitem> -</VarListEntry> - -<VarListEntry> -<Term>tcp:postgresql://server[:port][/dbname][as <Replaceable>connection name</Replaceable>][user <Replaceable>user name</Replaceable>]</Term> -<listitem><para></para></listitem> -</VarListEntry> - -<VarListEntry> -<Term>unix:postgresql://server[:port][/dbname][as <Replaceable>connection name</Replaceable>][user <Replaceable>user name</Replaceable>]</Term> -<listitem><para></para></listitem> -</VarListEntry> - -<VarListEntry> -<Term><Replaceable>character variable</Replaceable>[as <Replaceable>connection name</Replaceable>][user <Replaceable>user name</Replaceable>]</Term> -<listitem><para></para></listitem> -</VarListEntry> - -<VarListEntry> -<Term><Replaceable>character string</Replaceable>[as <Replaceable>connection name</Replaceable>][<Replaceable>user</Replaceable>]</Term> -<listitem><para></para></listitem> -</VarListEntry> - -<VarListEntry> -<Term>default</Term> -<listitem><para></para></listitem> -</VarListEntry> - -<VarListEntry> -<Term>user</Term> -<listitem><para></para></listitem> -</VarListEntry> -</VariableList> -</Para> - -<Para> -There are also different ways to specify the user name: -<VariableList> -<VarListEntry> -<Term><Replaceable>userid</Replaceable></Term> -<listitem><para></para></listitem> -</VarListEntry> -<VarListEntry> -<Term><Replaceable>userid</Replaceable>/<Replaceable>password</Replaceable></Term> -<listitem><para></para></listitem> -</VarListEntry> -<VarListEntry> -<Term><Replaceable>userid</Replaceable> identified by <Replaceable>password</Replaceable></Term> -<listitem><para></para></listitem> -</VarListEntry> -<VarListEntry> -<Term><Replaceable>userid</Replaceable> using <Replaceable>password</Replaceable></Term> -<listitem><para></para></listitem> -</VarListEntry> -</VariableList> -</Para> - -<Para> Finally the userid and the password. Each may be a constant text, a -character variable or a chararcter string. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>Disconnect statements</Term> -<ListItem> -<Para> -A disconnect statement looks loke: -<ProgramListing> -exec sql disconnect [<Replaceable>connection target</Replaceable>]; -</ProgramListing> -It closes the connection to the specified database. -</Para> - -<Para> -The <Replaceable>connection target</Replaceable> can be specified in the -following ways: -<VariableList> -<VarListEntry> -<Term><Replaceable>connection name</Replaceable></Term> -<listitem><para></para></listitem> -</VarListEntry> -<VarListEntry> -<Term>default</Term> -<listitem><para></para></listitem> -</VarListEntry> -<VarListEntry> -<Term>current</Term> -<listitem><para></para></listitem> -</VarListEntry> -<VarListEntry> -<Term>all</Term> -<listitem><para></para></listitem> -</VarListEntry> -</VariableList> -</Para> -</ListItem> -</VarListEntry> - -<!--WARNING: FROM HERE ON THE TEXT IS OUTDATED!--> -<VarListEntry> -<Term>Open cursor statement</Term> -<ListItem> -<Para> -An open cursor statement looks like: -<ProgramListing> -exec sql open <Replaceable>cursor</Replaceable>; -</ProgramListing> -and is ignore and not copied from the output. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>Commit statement</Term> -<ListItem> -<Para> -A commit statement looks like -<ProgramListing> + </programlisting> + </para> + + <para> + Instead the file specified is parsed by <application>ecpg</application> + itself. So the contents of the specified file is included in the resulting C + code. This way you are able to specify EXEC SQL commands in an include file. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>Connect statement</term> + <listitem> + <para> + A connect statement looks like: + <programlisting> +exec sql connect to <replaceable>connection target</replaceable>; + </programlisting> + It creates a connection to the specified database. + </para> + + <para> + The <replaceable>connection target</replaceable> can be specified in the + following ways: + <variablelist> + <varlistentry> + <term>dbname[@server][:port][as <replaceable>connection + name</replaceable>][user <replaceable>user name</replaceable>]</term> + <listitem><para></para></listitem> + </varlistentry> + + <varlistentry> + <term>tcp:postgresql://server[:port][/dbname][as + <replaceable>connection name</replaceable>][user <replaceable>user name</replaceable>]</term> + <listitem><para></para></listitem> + </varlistentry> + + <varlistentry> + <term>unix:postgresql://server[:port][/dbname][as + <replaceable>connection name</replaceable>][user <replaceable>user name</replaceable>]</term> + <listitem><para></para></listitem> + </varlistentry> + + <varlistentry> + <term><replaceable>character variable</replaceable>[as + <replaceable>connection name</replaceable>][user <replaceable>user name</replaceable>]</term> + <listitem><para></para></listitem> + </varlistentry> + + <varlistentry> + <term><replaceable>character string</replaceable>[as + <replaceable>connection name</replaceable>][<replaceable>user</replaceable>]</term> + <listitem><para></para></listitem> + </varlistentry> + + <varlistentry> + <term>default</term> + <listitem><para></para></listitem> + </varlistentry> + + <varlistentry> + <term>user</term> + <listitem><para></para></listitem> + </varlistentry> + </variablelist> + </para> + + <para> + There are also different ways to specify the user name: + <variablelist> + <varlistentry> + <term><replaceable>userid</replaceable></term> + <listitem><para></para></listitem> + </varlistentry> + <varlistentry> + <term><replaceable>userid</replaceable>/<replaceable>password</replaceable></term> + <listitem><para></para></listitem> + </varlistentry> + <varlistentry> + <term><replaceable>userid</replaceable> identified by <replaceable>password</replaceable></term> + <listitem><para></para></listitem> + </varlistentry> + <varlistentry> + <term><replaceable>userid</replaceable> using <replaceable>password</replaceable></term> + <listitem><para></para></listitem> + </varlistentry> + </variablelist> + </para> + + <para> Finally the userid and the password. Each may be a constant text, a + character variable or a chararcter string. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>Disconnect statements</term> + <listitem> + <para> + A disconnect statement looks loke: + <programlisting> +exec sql disconnect [<replaceable>connection target</replaceable>]; + </programlisting> + It closes the connection to the specified database. + </para> + + <para> + The <replaceable>connection target</replaceable> can be specified in the + following ways: + <variablelist> + <varlistentry> + <term><replaceable>connection name</replaceable></term> + <listitem><para></para></listitem> + </varlistentry> + <varlistentry> + <term>default</term> + <listitem><para></para></listitem> + </varlistentry> + <varlistentry> + <term>current</term> + <listitem><para></para></listitem> + </varlistentry> + <varlistentry> + <term>all</term> + <listitem><para></para></listitem> + </varlistentry> + </variablelist> + </para> + </listitem> + </varlistentry> + + <!--WARNING: FROM HERE ON THE TEXT IS OUTDATED!--> + <varlistentry> + <term>Open cursor statement</term> + <listitem> + <para> + An open cursor statement looks like: + <programlisting> +exec sql open <replaceable>cursor</replaceable>; + </programlisting> + and is ignore and not copied from the output. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>Commit statement</term> + <listitem> + <para> + A commit statement looks like + <programlisting> exec sql commit; -</ProgramListing> -and is translated on the output to -<ProgramListing> + </programlisting> + and is translated on the output to + <programlisting> ECPGcommit(__LINE__); -</ProgramListing> -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>Rollback statement</Term> -<ListItem> -<Para> -A rollback statement looks like -<ProgramListing> + </programlisting> + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>Rollback statement</term> + <listitem> + <para> + A rollback statement looks like + <programlisting> exec sql rollback; -</ProgramListing> -and is translated on the output to -<ProgramListing> + </programlisting> + and is translated on the output to + <programlisting> ECPGrollback(__LINE__); -</ProgramListing> -</Para> -</ListItem> -</VarListEntry> - -<!--STARTING HERE IT IS OKAY AGAIN!--> -<VarListEntry> -<Term>Other statements</Term> -<ListItem> -<Para> -Other <Acronym>SQL</Acronym> statements are other statements that start with -<Command>exec sql</Command> and ends with <Command>;</Command>. -Everything inbetween is treated -as an <Acronym>SQL</Acronym> statement and parsed for variable substitution. -</Para> - -<Para> -Variable substitution occur when a symbol starts with a colon -(<Command>:</Command>). Then a variable with that name is looked for among -the variables that were previously declared within a declare section and -depending on the variable being for input or output the pointers to the -variables are written to the output to allow for access by the function. -</Para> - -<Para> -For every variable that is part of the <Acronym>SQL</Acronym> request -the function gets another ten arguments: - -<SimpleList> -<Member>The type as a special symbol.</Member> -<Member>A pointer to the value or a pointer to the pointer.</Member> -<Member>The size of the variable if it is a char or varchar.</Member> -<Member>Number of elements in the array (for array fetches).</Member> -<Member>The offset to the next element in the array (for array fetches)</Member> -<Member>The type of the indicator variable as a special symbol.</Member> -<Member>A pointer to the value of the indicator variable or a pointer to the pointer of the indicator variable.</Member> -<Member>0.</Member> -<Member>Number of elements in the indicator array (for array fetches).</Member> -<Member>The offset to the next element in the indicator array (for array fetches)</Member> -</SimpleList> -</Para> - -</ListItem> -</VarListEntry> -</VariableList> -</Para> -</Sect2> - -<Sect2> -<Title>A Complete Example</Title> - -<Para> -Here is a complete example describing the output of the preprocessor of a -file foo.pgc: -<ProgramListing> + </programlisting> + </para> + </listitem> + </varlistentry> + + <!--STARTING HERE IT IS OKAY AGAIN!--> + <varlistentry> + <term>Other statements</term> + <listitem> + <para> + Other <acronym>SQL</acronym> statements are other statements that start with + <command>exec sql</command> and ends with <command>;</command>. + Everything inbetween is treated + as an <acronym>SQL</acronym> statement and parsed for variable substitution. + </para> + + <para> + Variable substitution occur when a symbol starts with a colon + (<command>:</command>). Then a variable with that name is looked for among + the variables that were previously declared within a declare section and + depending on the variable being for input or output the pointers to the + variables are written to the output to allow for access by the function. + </para> + + <para> + For every variable that is part of the <acronym>SQL</acronym> request + the function gets another ten arguments: + + <simplelist> + <member>The type as a special symbol.</member> + <member>A pointer to the value or a pointer to the pointer.</member> + <member>The size of the variable if it is a char or varchar.</member> + <member>Number of elements in the array (for array fetches).</member> + <member>The offset to the next element in the array (for array fetches)</member> + <member>The type of the indicator variable as a special symbol.</member> + <member>A pointer to the value of the indicator variable or a pointer to the pointer of the indicator variable.</member> + <member>0.</member> + <member>Number of elements in the indicator array (for array fetches).</member> + <member>The offset to the next element in the indicator array (for array fetches)</member> + </simplelist> + </para> + + </listitem> + </varlistentry> + </variablelist> + </para> + </sect2> + + <sect2> + <title>A Complete Example</title> + + <para> + Here is a complete example describing the output of the preprocessor of a + file foo.pgc: + <programlisting> exec sql begin declare section; int index; int result; exec sql end declare section; ... exec sql select res into :result from mytable where index = :index; -</ProgramListing> -is translated into: -<ProgramListing> + </programlisting> + is translated into: + <programlisting> /* Processed by ecpg (2.6.0) */ /* These two include files are added by the preprocessor */ #include <ecpgtype.h>; @@ -923,100 +935,117 @@ ECPGdo(__LINE__, NULL, "select res from mytable where index = ? ", ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); #line 147 "foo.pgc" -</ProgramListing> -(the indentation in this manual is added for readability and not -something that the preprocessor can do.) -</Para> -</sect2> - -<Sect2> -<Title>The Library</Title> - -<Para> -The most important function in the library is the <Function>ECPGdo</Function> -function. It takes a variable amount of arguments. Hopefully we will not run -into machines with limits on the amount of variables that can be -accepted by a vararg function. This could easily add up to 50 or so -arguments. -</Para> - -<Para> -The arguments are: - -<VariableList> -<VarListEntry> -<Term>A line number</Term> -<ListItem> -<Para> -This is a line number for the original line used in error messages only. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>A string</Term> -<ListItem> -<Para> -This is the <Acronym>SQL</Acronym> request that is to be issued. -This request is modified -by the input variables, i.e. the variables that where not known at -compile time but are to be entered in the request. Where the variables -should go the string contains <Quote>;</Quote>. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>Input variables</Term> -<ListItem> -<Para> -As described in the section about the preprocessor every input variable -gets ten arguments. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>ECPGt_EOIT</Term> -<ListItem> -<Para> -An enum telling that there are no more input variables. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>Output variables</Term> -<ListItem> -<Para> -As described in the section about the preprocessor every input variable -gets ten arguments. These variables are filled by the function. -</Para> -</ListItem> -</VarListEntry> - -<VarListEntry> -<Term>ECPGt_EORT</Term> -<ListItem> -<Para> -An enum telling that there are no more variables. -</Para> -</ListItem> -</VarListEntry> -</VariableList> -</Para> - -<Para> -All the <Acronym>SQL</Acronym> statements are performed in one transaction -unless you issue a commit transaction. To get this auto-transaction going -the first statement or the first after statement after a commit or rollback -always begins a transaction. To disable this feature per default use the -'-t' option on the commandline -</Para> - -<Para> -To be completed: entries describing the other entries. -</Para> -</sect2> -</sect1> -</Chapter> + </programlisting> + (the indentation in this manual is added for readability and not + something that the preprocessor can do.) + </para> + </sect2> + + <sect2> + <title>The Library</title> + + <para> + The most important function in the library is the <function>ECPGdo</function> + function. It takes a variable amount of arguments. Hopefully we will not run + into machines with limits on the amount of variables that can be + accepted by a vararg function. This could easily add up to 50 or so + arguments. + </para> + + <para> + The arguments are: + + <variablelist> + <varlistentry> + <term>A line number</term> + <listitem> + <para> + This is a line number for the original line used in error messages only. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>A string</term> + <listitem> + <para> + This is the <acronym>SQL</acronym> request that is to be issued. + This request is modified + by the input variables, i.e. the variables that where not known at + compile time but are to be entered in the request. Where the variables + should go the string contains <quote>;</quote>. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>Input variables</term> + <listitem> + <para> + As described in the section about the preprocessor every input variable + gets ten arguments. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>ECPGt_EOIT</term> + <listitem> + <para> + An enum telling that there are no more input variables. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>Output variables</term> + <listitem> + <para> + As described in the section about the preprocessor every input variable + gets ten arguments. These variables are filled by the function. + </para> + </listitem> + </varlistentry> + + <varlistentry> + <term>ECPGt_EORT</term> + <listitem> + <para> + An enum telling that there are no more variables. + </para> + </listitem> + </varlistentry> + </variablelist> + </para> + + <para> + All the <acronym>SQL</acronym> statements are performed in one transaction + unless you issue a commit transaction. To get this auto-transaction going + the first statement or the first after statement after a commit or rollback + always begins a transaction. To disable this feature per default use the + <option>-t</option> option on the commandline. + </para> + + <para> + To be completed: entries describing the other entries. + </para> + </sect2> + </sect1> + </chapter> + +<!-- Keep this comment at the end of the file +Local variables: +mode:sgml +sgml-omittag:nil +sgml-shorttag:t +sgml-minimize-attributes:nil +sgml-always-quote-attributes:t +sgml-indent-step:1 +sgml-indent-data:t +sgml-parent-document:nil +sgml-default-dtd-file:"./reference.ced" +sgml-exposed-tags:nil +sgml-local-catalogs:("/usr/lib/sgml/CATALOG") +sgml-local-ecat-files:nil +End: +--> diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index efb7f15de059a6ba76100c25b8598773bb09a3a5..ec84abeb92f6349ff39af7f54c4efcc54fe6bc28 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -1404,7 +1404,7 @@ Not defined by this name. Implements the intersection operator '#' <!-- Keep this comment at the end of the file Local variables: -mode: sgml +mode:sgml sgml-omittag:nil sgml-shorttag:t sgml-minimize-attributes:nil @@ -1414,7 +1414,7 @@ sgml-indent-data:t sgml-parent-document:nil sgml-default-dtd-file:"./reference.ced" sgml-exposed-tags:nil -sgml-local-catalogs:"/usr/lib/sgml/catalog" +sgml-local-catalogs:("/usr/lib/sgml/catalog") sgml-local-ecat-files:nil End: --> diff --git a/doc/src/sgml/indices.sgml b/doc/src/sgml/indices.sgml index 32aa5e7892ebcc82e30eb598a582a3ce03d53b66..2ea3e90879dd8c9e659dc4c3dbc7800ce81dcc57 100644 --- a/doc/src/sgml/indices.sgml +++ b/doc/src/sgml/indices.sgml @@ -394,7 +394,7 @@ CREATE MEMSTORE ON <table> COLUMNS <cols> <!-- Keep this comment at the end of the file Local variables: -mode: sgml +mode:sgml sgml-omittag:nil sgml-shorttag:t sgml-minimize-attributes:nil @@ -404,7 +404,7 @@ sgml-indent-data:t sgml-parent-document:nil sgml-default-dtd-file:"./reference.ced" sgml-exposed-tags:nil -sgml-local-catalogs:"/usr/lib/sgml/catalog" +sgml-local-catalogs:("/usr/lib/sgml/catalog") sgml-local-ecat-files:nil End: --> diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index fb48215c85a9a887d0e89bbda9b7057717f8bdfe..048cda624690629ed33a3f8ee0792e9a79741da6 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -1,10 +1,17 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/installation.sgml,v 1.7 1999/12/06 16:37:11 thomas Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/installation.sgml,v 1.8 2000/03/30 22:22:40 thomas Exp $ Postgres quick Installation Guide. - thomas 1998-10-26 $Log: installation.sgml,v $ +Revision 1.8 2000/03/30 22:22:40 thomas +Accumulated fixups. +Add some chapters on new topics. +Change to referencing OASIS/Docbook v3.1 rather than Davenport/Docbook v3.0 +Grepped for and fixed apparent tag mangling from emacs + "Normalize" operation. Should be the last of those. + Revision 1.7 1999/12/06 16:37:11 thomas Remove references to PostgreSQL as "public-domain" since that has a specific meaning wrt copyright (or lack thereof). @@ -39,7 +46,7 @@ First cut at standalone installation guide to replace INSTALL text source. --> -<!doctype book PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [ +<!doctype book PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [ <!entity about SYSTEM "about.sgml"> <!entity history SYSTEM "history.sgml"> diff --git a/doc/src/sgml/intro-ag.sgml b/doc/src/sgml/intro-ag.sgml index 83d18555c3463b2cbc857af99ed9d7b71410949f..f7ad4c78186daede24be59523cadcdee199cdcf7 100644 --- a/doc/src/sgml/intro-ag.sgml +++ b/doc/src/sgml/intro-ag.sgml @@ -19,6 +19,7 @@ &info; ¬ation; + &problems; &y2k; &legal; @@ -26,7 +27,7 @@ <!-- Keep this comment at the end of the file Local variables: -mode: sgml +mode:sgml sgml-omittag:nil sgml-shorttag:t sgml-minimize-attributes:nil @@ -36,7 +37,7 @@ sgml-indent-data:t sgml-parent-document:nil sgml-default-dtd-file:"./reference.ced" sgml-exposed-tags:nil -sgml-local-catalogs:"/usr/lib/sgml/CATALOG" +sgml-local-catalogs:("/usr/lib/sgml/CATALOG") sgml-local-ecat-files:nil End: --> diff --git a/doc/src/sgml/intro-pg.sgml b/doc/src/sgml/intro-pg.sgml index 093ab42c4bed7e28558c3f05679246cc57f64003..a8cb214e4ec59c47536c337dfd9b937522cdfa34 100644 --- a/doc/src/sgml/intro-pg.sgml +++ b/doc/src/sgml/intro-pg.sgml @@ -39,6 +39,7 @@ &info; ¬ation; + &problems; &y2k; &legal; @@ -46,7 +47,7 @@ <!-- Keep this comment at the end of the file Local variables: -mode: sgml +mode:sgml sgml-omittag:nil sgml-shorttag:t sgml-minimize-attributes:nil @@ -56,7 +57,7 @@ sgml-indent-data:t sgml-parent-document:nil sgml-default-dtd-file:"./reference.ced" sgml-exposed-tags:nil -sgml-local-catalogs:"/usr/lib/sgml/CATALOG" +sgml-local-catalogs:("/usr/lib/sgml/CATALOG") sgml-local-ecat-files:nil End: --> diff --git a/doc/src/sgml/intro.sgml b/doc/src/sgml/intro.sgml index d5eea403dcb7ea6fb97eddb1e858c0132299a9c0..eba5ac85815ad45ca714d3cf60432d365dc4dd11 100644 --- a/doc/src/sgml/intro.sgml +++ b/doc/src/sgml/intro.sgml @@ -73,7 +73,7 @@ &about; &info; ¬ation; - &bug-reporting; + &problems; &y2k; &legal; diff --git a/doc/src/sgml/jdbc.sgml b/doc/src/sgml/jdbc.sgml index 45a11e0dc80b881ed40d92861312da29068c4ec7..0e2fc75b594f0e93bc651d96d2ad47d8d4f58938 100644 --- a/doc/src/sgml/jdbc.sgml +++ b/doc/src/sgml/jdbc.sgml @@ -233,13 +233,13 @@ Class.forName("postgresql.Driver"); <listitem> <para> - jdbc:postgresql://<replaceable class="parameter">>hos</replaceable>>/<replaceable class="parameter">database</replaceable> + jdbc:postgresql://<replaceable class="parameter">host</replaceable>/<replaceable class="parameter">database</replaceable> </para> </listitem> <listitem> <para> - jdbc:postgresql://<replaceable class="parameter">>hos</replaceable>><replaceable class="parameter">">po</replaceable>e>/<replaceable class="parameter">database</replaceable> + jdbc:postgresql://<replaceable class="parameter">host</replaceable><replaceable class="parameter">port</replaceable>/<replaceable class="parameter">database</replaceable> </para> </listitem> </itemizedlist> diff --git a/doc/src/sgml/libpgtcl.sgml b/doc/src/sgml/libpgtcl.sgml index 682f7ad18246158397ec935bdb700f953c39c6fd..724bbff597362fe8fa25cf3ac1a9e25c548a4151 100644 --- a/doc/src/sgml/libpgtcl.sgml +++ b/doc/src/sgml/libpgtcl.sgml @@ -671,6 +671,16 @@ the number of attributes in each tuple. </VARLISTENTRY> <VARLISTENTRY> <TERM> +-list VarName +</TERM> +<LISTITEM> +<PARA> +assign the results to a list of lists. +</PARA> +</LISTITEM> +</VARLISTENTRY> +<VARLISTENTRY> +<TERM> -assign arrayName </TERM> <LISTITEM> diff --git a/doc/src/sgml/plan.sgml b/doc/src/sgml/plan.sgml new file mode 100644 index 0000000000000000000000000000000000000000..ef30a1a2a7f3de159a1acfd5643c762f4b0176c1 --- /dev/null +++ b/doc/src/sgml/plan.sgml @@ -0,0 +1,263 @@ + <chapter> + <title>Understanding Performance</title> + + <para> + Query performance can be affected by many things. Some of these can + be manipulated by the user, while others are fundamental to the underlying + design of the system. + </para> + + <para> + Some performance issues, such as index creation and bulk data + loading, are covered elsewhere. This chapter will discuss the + <command>EXPLAIN</command> command, and will show how the details + of a query can affect the query plan, and hence overall + performance. + </para> + + <sect1> + <title>Using <command>EXPLAIN</command></title> + + <note> + <title>Author</title> + <para> + Written by Tom Lane, from e-mail dated 2000-03-27. + </para> + </note> + + <para> + Plan-reading is an art that deserves a tutorial, and I haven't + had time to write one. Here is some quick & dirty explanation. + </para> + + <para> + The numbers that are currently quoted by EXPLAIN are: + + <itemizedlist> + <listitem> + <para> + Estimated startup cost (time expended before output scan can start, + eg, time to do the sorting in a SORT node). + </para> + </listitem> + + <listitem> + <para> + Estimated total cost (if all tuples are retrieved, which they may not + be --- LIMIT will stop short of paying the total cost, for + example). + </para> + </listitem> + + <listitem> + <para> + Estimated number of rows output by this plan node. + </para> + </listitem> + + <listitem> + <para> + Estimated average width (in bytes) of rows output by this plan + node. + </para> + </listitem> + </itemizedlist> + </para> + + <para> + The costs are measured in units of disk page fetches. (There are some + fairly bogus fudge-factors for converting CPU effort estimates into + disk-fetch units; see the SET ref page if you want to play with these.) + It's important to note that the cost of an upper-level node includes + the cost of all its child nodes. It's also important to realize that + the cost only reflects things that the planner/optimizer cares about. + In particular, the cost does not consider the time spent transmitting + result tuples to the frontend --- which could be a pretty dominant + factor in the true elapsed time, but the planner ignores it because + it cannot change it by altering the plan. (Every correct plan will + output the same tuple set, we trust.) + </para> + + <para> + Rows output is a little tricky because it is *not* the number of rows + processed/scanned by the query --- it is usually less, reflecting the + estimated selectivity of any WHERE-clause constraints that are being + applied at this node. + </para> + + <para> + Average width is pretty bogus because the thing really doesn't have + any idea of the average length of variable-length columns. I'm thinking + about improving that in the future, but it may not be worth the trouble, + because the width isn't used for very much. + </para> + + <para> + Here are some examples (using the regress test database after a + vacuum analyze, and current sources): + + <programlisting> +regression=# explain select * from tenk1; +NOTICE: QUERY PLAN: + +Seq Scan on tenk1 (cost=0.00..333.00 rows=10000 width=148) + </programlisting> + </para> + + <para> + About as straightforward as it gets. If you do + + <programlisting> +select * from pg_class where relname = 'tenk1'; + </programlisting> + + you'll find out that tenk1 has 233 disk + pages and 10000 tuples. So the cost is estimated at 233 block + reads, defined as 1.0 apiece, plus 10000 * cpu_tuple_cost which is + currently 0.01 (try <command>show cpu_tuple_cost</command>). + </para> + + <para> + Now let's modify the query to add a qualification clause: + + <programlisting> +regression=# explain select * from tenk1 where unique1 < 1000; +NOTICE: QUERY PLAN: + +Seq Scan on tenk1 (cost=0.00..358.00 rows=1000 width=148) + </programlisting> + + Estimated output rows has gone down because of the WHERE clause. + (The uncannily accurate estimate is just because tenk1 is a particularly + simple case --- the unique1 column has 10000 distinct values ranging + from 0 to 9999, so the estimator's linear interpolation between min and + max column values is dead-on.) However, the scan will still have to + visit all 10000 rows, so the cost hasn't decreased; in fact it has gone + up a bit to reflect the extra CPU time spent checking the WHERE + condition. + </para> + + <para> + Modify the query to restrict the qualification even more: + + <programlisting> +regression=# explain select * from tenk1 where unique1 < 100; +NOTICE: QUERY PLAN: + +Index Scan using tenk1_unique1 on tenk1 (cost=0.00..89.35 rows=100 width=148) + </programlisting> + + and you will see that if we make the WHERE condition selective + enough, the planner will + eventually decide that an indexscan is cheaper than a sequential scan. + This plan will only have to visit 100 tuples because of the index, + so it wins despite the fact that each individual fetch is expensive. + </para> + + <para> + Add another condition to the qualification: + + <programlisting> +regression=# explain select * from tenk1 where unique1 < 100 and +regression-# stringu1 = 'xxx'; +NOTICE: QUERY PLAN: + +Index Scan using tenk1_unique1 on tenk1 (cost=0.00..89.60 rows=1 width=148) + </programlisting> + + The added clause "stringu1 = 'xxx'" reduces the output-rows estimate, + but not the cost because we still have to visit the same set of tuples. + </para> + + <para> + Let's try joining two tables, using the fields we have been discussing: + + <programlisting> +regression=# explain select * from tenk1 t1, tenk2 t2 where t1.unique1 < 100 +regression-# and t1.unique2 = t2.unique2; +NOTICE: QUERY PLAN: + +Nested Loop (cost=0.00..144.07 rows=100 width=296) + -> Index Scan using tenk1_unique1 on tenk1 t1 + (cost=0.00..89.35 rows=100 width=148) + -> Index Scan using tenk2_unique2 on tenk2 t2 + (cost=0.00..0.53 rows=1 width=148) + </programlisting> + </para> + + <para> + In this nested-loop join, the outer scan is the same indexscan we had + in the example before last, and the cost and row count are the same + because we are applying the "unique1 < 100" WHERE clause at this node. + The "t1.unique2 = t2.unique2" clause isn't relevant yet, so it doesn't + affect the row count. For the inner scan, we assume that the current + outer-scan tuple's unique2 value is plugged into the inner indexscan + to produce an indexqual like + "t2.unique2 = <replaceable>constant</replaceable>". So we get the + same inner-scan plan and costs that we'd get from, say, "explain select + * from tenk2 where unique2 = 42". The loop node's costs are then set + on the basis of the outer scan's cost, plus one repetition of the + inner scan for each outer tuple (100 * 0.53, here), plus a little CPU + time for join processing. + </para> + + <para> + In this example the loop's output row count is the same as the product + of the two scans' row counts, but that's not true in general, because + in general you can have WHERE clauses that mention both relations and + so can only be applied at the join point, not to either input scan. + For example, if we added "WHERE ... AND t1.hundred < t2.hundred", + that'd decrease the output row count of the join node, but not change + either input scan. + </para> + + <para> + We can look at variant plans by forcing the planner to disregard + whatever strategy it thought was the winner (a pretty crude tool, + but it's what we've got at the moment): + + <programlisting> +regression=# set enable_nestloop = 'off'; +SET VARIABLE +regression=# explain select * from tenk1 t1, tenk2 t2 where t1.unique1 < 100 +regression-# and t1.unique2 = t2.unique2; +NOTICE: QUERY PLAN: + +Hash Join (cost=89.60..574.10 rows=100 width=296) + -> Seq Scan on tenk2 t2 + (cost=0.00..333.00 rows=10000 width=148) + -> Hash (cost=89.35..89.35 rows=100 width=148) + -> Index Scan using tenk1_unique1 on tenk1 t1 + (cost=0.00..89.35 rows=100 width=148) + </programlisting> + + This plan proposes to extract the 100 interesting rows of tenk1 + using ye same olde indexscan, stash them into an in-memory hash table, + and then do a sequential scan of tenk2, probing into the hash table + for possible matches of "t1.unique2 = t2.unique2" at each tenk2 tuple. + The cost to read tenk1 and set up the hash table is entirely startup + cost for the hash join, since we won't get any tuples out until we can + start reading tenk2. The total time estimate for the join also + includes a pretty hefty charge for CPU time to probe the hash table + 10000 times. Note, however, that we are NOT charging 10000 times 89.35; + the hash table setup is only done once in this plan type. + </para> + </sect1> + </chapter> + +<!-- Keep this comment at the end of the file +Local variables: +mode:sgml +sgml-omittag:nil +sgml-shorttag:t +sgml-minimize-attributes:nil +sgml-always-quote-attributes:t +sgml-indent-step:1 +sgml-indent-data:t +sgml-parent-document:nil +sgml-default-dtd-file:"./reference.ced" +sgml-exposed-tags:nil +sgml-local-catalogs:("/usr/lib/sgml/CATALOG") +sgml-local-ecat-files:nil +End: +--> diff --git a/doc/src/sgml/postgres.sgml b/doc/src/sgml/postgres.sgml index e94e561ee8e6d22d51e4efa0144da39213a469c1..f189b9b010e42afc80787875fc2922d61b57ec09 100644 --- a/doc/src/sgml/postgres.sgml +++ b/doc/src/sgml/postgres.sgml @@ -1,98 +1,104 @@ <!doctype book PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [ -<!entity about SYSTEM "about.sgml"> -<!entity bug-reporting SYSTEM "bug-reporting.sgml"> -<!entity history SYSTEM "history.sgml"> -<!entity info SYSTEM "info.sgml"> -<!entity legal SYSTEM "legal.sgml"> -<!entity notation SYSTEM "notation.sgml"> -<!entity y2k SYSTEM "y2k.sgml"> +<!entity about SYSTEM "about.sgml"> +<!entity history SYSTEM "history.sgml"> +<!entity info SYSTEM "info.sgml"> +<!entity legal SYSTEM "legal.sgml"> +<!entity notation SYSTEM "notation.sgml"> +<!entity problems SYSTEM "problems.sgml"> +<!entity y2k SYSTEM "y2k.sgml"> <!-- tutorial --> -<!entity arch SYSTEM "arch.sgml"> -<!entity intro SYSTEM "intro.sgml"> -<!entity query SYSTEM "query.sgml"> -<!entity sql SYSTEM "sql.sgml"> -<!entity start SYSTEM "start.sgml"> +<!entity arch SYSTEM "arch.sgml"> +<!entity intro SYSTEM "intro.sgml"> +<!entity query SYSTEM "query.sgml"> +<!entity sql SYSTEM "sql.sgml"> +<!entity start SYSTEM "start.sgml"> <!-- user's guide --> -<!entity advanced SYSTEM "advanced.sgml"> -<!entity array SYSTEM "array.sgml"> -<!entity datatype SYSTEM "datatype.sgml"> -<!entity datetime SYSTEM "datetime.sgml"> -<!entity environ SYSTEM "environ.sgml"> -<!entity func SYSTEM "func.sgml"> -<!entity indices SYSTEM "indices.sgml"> -<!entity inherit SYSTEM "inherit.sgml"> -<!entity manage SYSTEM "manage.sgml"> -<!entity mvcc SYSTEM "mvcc.sgml"> -<!entity oper SYSTEM "oper.sgml"> -<!entity pgaccess SYSTEM "pgaccess.sgml"> -<!entity psql SYSTEM "psql.sgml"> -<!entity query-ug SYSTEM "query-ug.sgml"> -<!entity storage SYSTEM "storage.sgml"> -<!entity syntax SYSTEM "syntax.sgml"> -<!entity typeconv SYSTEM "typeconv.sgml"> +<!entity advanced SYSTEM "advanced.sgml"> +<!entity array SYSTEM "array.sgml"> +<!entity datatype SYSTEM "datatype.sgml"> +<!entity datetime SYSTEM "datetime.sgml"> +<!entity environ SYSTEM "environ.sgml"> +<!entity func SYSTEM "func.sgml"> +<!entity indices SYSTEM "indices.sgml"> +<!entity inherit SYSTEM "inherit.sgml"> +<!entity manage SYSTEM "manage.sgml"> +<!entity mvcc SYSTEM "mvcc.sgml"> +<!entity oper SYSTEM "oper.sgml"> +<!entity plan SYSTEM "plan.sgml"> +<!entity plperl SYSTEM "plperl.sgml"> +<!entity plsql SYSTEM "plsql.sgml"> +<!entity pltcl SYSTEM "pltcl.sgml"> +<!entity populate SYSTEM "populate.sgml"> +<!entity psql SYSTEM "psql.sgml"> +<!entity query-ug SYSTEM "query-ug.sgml"> +<!entity storage SYSTEM "storage.sgml"> +<!entity syntax SYSTEM "syntax.sgml"> +<!entity typeconv SYSTEM "typeconv.sgml"> <!-- reference pages --> -<!entity % allfiles SYSTEM "ref/allfiles.sgml"> +<!entity % allfiles SYSTEM "ref/allfiles.sgml"> %allfiles; <!-- administrator's guide --> -<!entity config SYSTEM "config.sgml"> -<!entity intro-ag SYSTEM "intro-ag.sgml"> -<!entity install SYSTEM "install.sgml"> -<!entity installw SYSTEM "install-win32.sgml"> -<!entity layout SYSTEM "layout.sgml"> -<!entity manage-ag SYSTEM "manage-ag.sgml"> -<!entity ports SYSTEM "ports.sgml"> -<!entity recovery SYSTEM "recovery.sgml"> -<!entity regress SYSTEM "regress.sgml"> -<!entity release SYSTEM "release.sgml"> -<!entity runtime SYSTEM "runtime.sgml"> -<!entity security SYSTEM "security.sgml"> -<!entity start-ag SYSTEM "start-ag.sgml"> -<!entity trouble SYSTEM "trouble.sgml"> +<!entity config SYSTEM "config.sgml"> +<!entity intro-ag SYSTEM "intro-ag.sgml"> +<!entity install SYSTEM "install.sgml"> +<!entity installw SYSTEM "install-win32.sgml"> +<!entity layout SYSTEM "layout.sgml"> +<!entity manage-ag SYSTEM "manage-ag.sgml"> +<!entity ports SYSTEM "ports.sgml"> +<!entity recovery SYSTEM "recovery.sgml"> +<!entity regress SYSTEM "regress.sgml"> +<!entity release SYSTEM "release.sgml"> +<!entity runtime SYSTEM "runtime.sgml"> +<!entity security SYSTEM "security.sgml"> +<!entity start-ag SYSTEM "start-ag.sgml"> +<!entity trouble SYSTEM "trouble.sgml"> <!-- programmer's guide --> -<!entity arch-pg SYSTEM "arch-pg.sgml"> -<!entity dfunc SYSTEM "dfunc.sgml"> -<!entity ecpg SYSTEM "ecpg.sgml"> -<!entity extend SYSTEM "extend.sgml"> -<!entity func-ref SYSTEM "func-ref.sgml"> -<!entity gist SYSTEM "gist.sgml"> -<!entity intro-pg SYSTEM "intro-pg.sgml"> -<!entity jdbc SYSTEM "jdbc.sgml"> -<!entity libpq SYSTEM "libpq.sgml"> -<!entity libpqpp SYSTEM "libpq++.sgml"> -<!entity libpgtcl SYSTEM "libpgtcl.sgml"> -<!entity lisp SYSTEM "lisp.sgml"> -<!entity lobj SYSTEM "lobj.sgml"> -<!entity odbc SYSTEM "odbc.sgml"> -<!entity rules SYSTEM "rules.sgml"> -<!entity spi SYSTEM "spi.sgml"> -<!entity trigger SYSTEM "trigger.sgml"> -<!entity xaggr SYSTEM "xaggr.sgml"> -<!entity xfunc SYSTEM "xfunc.sgml"> -<!entity xindex SYSTEM "xindex.sgml"> -<!entity xplang SYSTEM "xplang.sgml"> -<!entity xoper SYSTEM "xoper.sgml"> -<!entity xtypes SYSTEM "xtypes.sgml"> +<!entity arch-pg SYSTEM "arch-pg.sgml"> +<!entity dfunc SYSTEM "dfunc.sgml"> +<!entity ecpg SYSTEM "ecpg.sgml"> +<!entity extend SYSTEM "extend.sgml"> +<!entity func-ref SYSTEM "func-ref.sgml"> +<!entity gist SYSTEM "gist.sgml"> +<!entity intro-pg SYSTEM "intro-pg.sgml"> +<!entity indexcost SYSTEM "indexcost.sgml"> +<!entity jdbc SYSTEM "jdbc.sgml"> +<!entity libpq SYSTEM "libpq.sgml"> +<!entity libpqpp SYSTEM "libpq++.sgml"> +<!entity libpgtcl SYSTEM "libpgtcl.sgml"> +<!entity lisp SYSTEM "lisp.sgml"> +<!entity lobj SYSTEM "lobj.sgml"> +<!entity odbc SYSTEM "odbc.sgml"> +<!entity rules SYSTEM "rules.sgml"> +<!entity spi SYSTEM "spi.sgml"> +<!entity trigger SYSTEM "trigger.sgml"> +<!entity xaggr SYSTEM "xaggr.sgml"> +<!entity xfunc SYSTEM "xfunc.sgml"> +<!entity xindex SYSTEM "xindex.sgml"> +<!entity xplang SYSTEM "xplang.sgml"> +<!entity xoper SYSTEM "xoper.sgml"> +<!entity xtypes SYSTEM "xtypes.sgml"> <!-- developer's guide --> -<!entity arch-dev SYSTEM "arch-dev.sgml"> -<!entity biblio SYSTEM "biblio.sgml"> -<!entity bki SYSTEM "bki.sgml"> -<!entity compiler SYSTEM "compiler.sgml"> -<!entity contacts SYSTEM "contacts.sgml"> -<!entity cvs SYSTEM "cvs.sgml"> -<!entity docguide SYSTEM "docguide.sgml"> -<!entity geqo SYSTEM "geqo.sgml"> -<!entity options SYSTEM "pg_options.sgml"> -<!entity page SYSTEM "page.sgml"> -<!entity protocol SYSTEM "protocol.sgml"> -<!entity signals SYSTEM "signals.sgml"> -<!entity sources SYSTEM "sources.sgml"> +<!entity arch-dev SYSTEM "arch-dev.sgml"> +<!entity biblio SYSTEM "biblio.sgml"> +<!entity bki SYSTEM "bki.sgml"> +<!entity compiler SYSTEM "compiler.sgml"> +<!entity contacts SYSTEM "contacts.sgml"> +<!entity cvs SYSTEM "cvs.sgml"> +<!entity docguide SYSTEM "docguide.sgml"> +<!entity geqo SYSTEM "geqo.sgml"> +<!entity index SYSTEM "index.sgml"> +<!entity options SYSTEM "pg_options.sgml"> +<!entity page SYSTEM "page.sgml"> +<!entity protocol SYSTEM "protocol.sgml"> +<!entity signals SYSTEM "signals.sgml"> +<!entity sources SYSTEM "sources.sgml"> ]> <!-- entity manpages SYSTEM "man/manpages.sgml" subdoc --> <Book Id="postgres"> @@ -181,10 +187,15 @@ Your name here... &indices; &array; &inherit; + &plsql; + &pltcl; + &plperl; &mvcc; &environ; &manage; &storage; + &plan; + &populate; &commands; </Part> @@ -237,6 +248,7 @@ Your name here... &xaggr; &rules; &xindex; + &indexcost; &gist; &dfunc; &trigger; diff --git a/doc/src/sgml/programmer.sgml b/doc/src/sgml/programmer.sgml index c01041fa4bf3cc71dd04cc4b8b6828e480d0d2e4..b559f94ece41adb3e0b572ed86cb8cebea5dc788 100644 --- a/doc/src/sgml/programmer.sgml +++ b/doc/src/sgml/programmer.sgml @@ -1,9 +1,16 @@ <!-- -$Header: /cvsroot/pgsql/doc/src/sgml/Attic/programmer.sgml,v 1.22 2000/03/28 14:16:06 thomas Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/Attic/programmer.sgml,v 1.23 2000/03/30 22:22:41 thomas Exp $ Postgres Programmer's Guide. $Log: programmer.sgml,v $ +Revision 1.23 2000/03/30 22:22:41 thomas +Accumulated fixups. +Add some chapters on new topics. +Change to referencing OASIS/Docbook v3.1 rather than Davenport/Docbook v3.0 +Grepped for and fixed apparent tag mangling from emacs + "Normalize" operation. Should be the last of those. + Revision 1.22 2000/03/28 14:16:06 thomas Update SGML catalog references to DocBook 3.1 on FreeBSD. Matches postgresql.org/hub.org environment. @@ -49,46 +56,49 @@ Make new file current.sgml to hold release info for the current release. <!entity info SYSTEM "info.sgml"> <!entity legal SYSTEM "legal.sgml"> <!entity notation SYSTEM "notation.sgml"> +<!entity problems SYSTEM "problems.sgml"> <!entity y2k SYSTEM "y2k.sgml"> -<!entity arch-pg SYSTEM "arch-pg.sgml"> -<!entity dfunc SYSTEM "dfunc.sgml"> -<!entity ecpg SYSTEM "ecpg.sgml"> -<!entity extend SYSTEM "extend.sgml"> -<!entity func-ref SYSTEM "func-ref.sgml"> -<!entity gist SYSTEM "gist.sgml"> -<!entity intro-pg SYSTEM "intro-pg.sgml"> -<!entity jdbc SYSTEM "jdbc.sgml"> -<!entity libpq SYSTEM "libpq.sgml"> -<!entity libpqpp SYSTEM "libpq++.sgml"> -<!entity libpgtcl SYSTEM "libpgtcl.sgml"> -<!entity lisp SYSTEM "lisp.sgml"> -<!entity lobj SYSTEM "lobj.sgml"> -<!entity odbc SYSTEM "odbc.sgml"> -<!entity rules SYSTEM "rules.sgml"> -<!entity spi SYSTEM "spi.sgml"> -<!entity trigger SYSTEM "trigger.sgml"> -<!entity xaggr SYSTEM "xaggr.sgml"> -<!entity xfunc SYSTEM "xfunc.sgml"> -<!entity xindex SYSTEM "xindex.sgml"> -<!entity xplang SYSTEM "xplang.sgml"> -<!entity xoper SYSTEM "xoper.sgml"> -<!entity xtypes SYSTEM "xtypes.sgml"> +<!entity arch-pg SYSTEM "arch-pg.sgml"> +<!entity dfunc SYSTEM "dfunc.sgml"> +<!entity ecpg SYSTEM "ecpg.sgml"> +<!entity extend SYSTEM "extend.sgml"> +<!entity func-ref SYSTEM "func-ref.sgml"> +<!entity gist SYSTEM "gist.sgml"> +<!entity intro-pg SYSTEM "intro-pg.sgml"> +<!entity indexcost SYSTEM "indexcost.sgml"> +<!entity jdbc SYSTEM "jdbc.sgml"> +<!entity libpq SYSTEM "libpq.sgml"> +<!entity libpqpp SYSTEM "libpq++.sgml"> +<!entity libpgtcl SYSTEM "libpgtcl.sgml"> +<!entity lisp SYSTEM "lisp.sgml"> +<!entity lobj SYSTEM "lobj.sgml"> +<!entity odbc SYSTEM "odbc.sgml"> +<!entity plperl SYSTEM "plperl.sgml"> +<!entity rules SYSTEM "rules.sgml"> +<!entity spi SYSTEM "spi.sgml"> +<!entity trigger SYSTEM "trigger.sgml"> +<!entity xaggr SYSTEM "xaggr.sgml"> +<!entity xfunc SYSTEM "xfunc.sgml"> +<!entity xindex SYSTEM "xindex.sgml"> +<!entity xplang SYSTEM "xplang.sgml"> +<!entity xoper SYSTEM "xoper.sgml"> +<!entity xtypes SYSTEM "xtypes.sgml"> <!-- developer's guide --> -<!entity arch-dev SYSTEM "arch-dev.sgml"> -<!entity biblio SYSTEM "biblio.sgml"> -<!entity bki SYSTEM "bki.sgml"> -<!entity compiler SYSTEM "compiler.sgml"> -<!entity contacts SYSTEM "contacts.sgml"> -<!entity cvs SYSTEM "cvs.sgml"> -<!entity docguide SYSTEM "docguide.sgml"> -<!entity geqo SYSTEM "geqo.sgml"> -<!entity options SYSTEM "pg_options.sgml"> -<!entity page SYSTEM "page.sgml"> -<!entity protocol SYSTEM "protocol.sgml"> -<!entity signals SYSTEM "signals.sgml"> -<!entity sources SYSTEM "sources.sgml"> +<!entity arch-dev SYSTEM "arch-dev.sgml"> +<!entity biblio SYSTEM "biblio.sgml"> +<!entity bki SYSTEM "bki.sgml"> +<!entity compiler SYSTEM "compiler.sgml"> +<!entity contacts SYSTEM "contacts.sgml"> +<!entity cvs SYSTEM "cvs.sgml"> +<!entity docguide SYSTEM "docguide.sgml"> +<!entity geqo SYSTEM "geqo.sgml"> +<!entity options SYSTEM "pg_options.sgml"> +<!entity page SYSTEM "page.sgml"> +<!entity protocol SYSTEM "protocol.sgml"> +<!entity signals SYSTEM "signals.sgml"> +<!entity sources SYSTEM "sources.sgml"> ]> <book id="programmer"> @@ -169,8 +179,10 @@ Your name here... &xaggr; &rules; &xindex; + &indexcost; &gist; &xplang; + &plperl; &dfunc; <!-- reference --> diff --git a/doc/src/sgml/refentry.sgml b/doc/src/sgml/refentry.sgml index 720d8bd1b7f4cbfe5890a966e23a0712744deb37..64d102c130870954d448af693e9fc8106d859238 100644 --- a/doc/src/sgml/refentry.sgml +++ b/doc/src/sgml/refentry.sgml @@ -1 +1 @@ -<!doctype refentry PUBLIC "-//Davenport//DTD DocBook V3.0//EN"> +<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN"> diff --git a/doc/src/sgml/reference.sgml b/doc/src/sgml/reference.sgml index 5dcda9acacdae3c10a01a0249c43f95338a0355f..7dd2eeaafb1bcf282d01e299279ba7b5261e4f8f 100644 --- a/doc/src/sgml/reference.sgml +++ b/doc/src/sgml/reference.sgml @@ -1,10 +1,17 @@ <!-- reference.sgml -$Header: /cvsroot/pgsql/doc/src/sgml/reference.sgml,v 1.6 1999/05/26 17:30:30 thomas Exp $ +$Header: /cvsroot/pgsql/doc/src/sgml/reference.sgml,v 1.7 2000/03/30 22:22:41 thomas Exp $ Postgres User's Reference documentation. - thomas 1998-08-31 $Log: reference.sgml,v $ +Revision 1.7 2000/03/30 22:22:41 thomas +Accumulated fixups. +Add some chapters on new topics. +Change to referencing OASIS/Docbook v3.1 rather than Davenport/Docbook v3.0 +Grepped for and fixed apparent tag mangling from emacs + "Normalize" operation. Should be the last of those. + Revision 1.6 1999/05/26 17:30:30 thomas Add chapters on CVS access, MVCC, SQL theory to the docs. Add an appendix with more details on date/time attributes and handling. @@ -24,7 +31,7 @@ Bigger updates to the installation instructions (install and config). --> -<!doctype book PUBLIC "-//Davenport//DTD DocBook V3.0//EN" [ +<!doctype book PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [ <!entity intro SYSTEM "intro.sgml"> <!entity % allfiles SYSTEM "ref/allfiles.sgml"> diff --git a/doc/src/sgml/tutorial.sgml b/doc/src/sgml/tutorial.sgml index 0f1d93e45e308e1025d588123a441917ed40b6f1..02a210ac0ef1ca2c143f2ba3d93427179faaf066 100644 --- a/doc/src/sgml/tutorial.sgml +++ b/doc/src/sgml/tutorial.sgml @@ -11,6 +11,7 @@ <!entity info SYSTEM "info.sgml"> <!entity legal SYSTEM "legal.sgml"> <!entity notation SYSTEM "notation.sgml"> +<!entity problems SYSTEM "problems.sgml"> <!entity y2k SYSTEM "y2k.sgml"> <!entity advanced SYSTEM "advanced.sgml"> diff --git a/doc/src/sgml/user.sgml b/doc/src/sgml/user.sgml index 3309737fd735347dd67f23e253822da4744fc139..d770f9cc61f3300a8a4b95ee8b78a4ddf0d7b4aa 100644 --- a/doc/src/sgml/user.sgml +++ b/doc/src/sgml/user.sgml @@ -1,29 +1,34 @@ <!doctype book PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [ -<!entity about SYSTEM "about.sgml"> -<!entity bug-reporting SYSTEM "bug-reporting.sgml"> -<!entity history SYSTEM "history.sgml"> -<!entity info SYSTEM "info.sgml"> -<!entity legal SYSTEM "legal.sgml"> -<!entity notation SYSTEM "notation.sgml"> -<!entity y2k SYSTEM "y2k.sgml"> - -<!entity advanced SYSTEM "advanced.sgml"> -<!entity array SYSTEM "array.sgml"> -<!entity biblio SYSTEM "biblio.sgml"> -<!entity datatype SYSTEM "datatype.sgml"> -<!entity datetime SYSTEM "datetime.sgml"> -<!entity environ SYSTEM "environ.sgml"> -<!entity func SYSTEM "func.sgml"> -<!entity indices SYSTEM "indices.sgml"> -<!entity inherit SYSTEM "inherit.sgml"> -<!entity intro SYSTEM "intro.sgml"> -<!entity manage SYSTEM "manage.sgml"> -<!entity mvcc SYSTEM "mvcc.sgml"> -<!entity oper SYSTEM "oper.sgml"> -<!entity storage SYSTEM "storage.sgml"> -<!entity syntax SYSTEM "syntax.sgml"> -<!entity typeconv SYSTEM "typeconv.sgml"> +<!entity about SYSTEM "about.sgml"> +<!entity history SYSTEM "history.sgml"> +<!entity info SYSTEM "info.sgml"> +<!entity legal SYSTEM "legal.sgml"> +<!entity notation SYSTEM "notation.sgml"> +<!entity problems SYSTEM "problems.sgml"> +<!entity y2k SYSTEM "y2k.sgml"> + +<!entity advanced SYSTEM "advanced.sgml"> +<!entity array SYSTEM "array.sgml"> +<!entity biblio SYSTEM "biblio.sgml"> +<!entity datatype SYSTEM "datatype.sgml"> +<!entity datetime SYSTEM "datetime.sgml"> +<!entity environ SYSTEM "environ.sgml"> +<!entity func SYSTEM "func.sgml"> +<!entity indices SYSTEM "indices.sgml"> +<!entity inherit SYSTEM "inherit.sgml"> +<!entity intro SYSTEM "intro.sgml"> +<!entity manage SYSTEM "manage.sgml"> +<!entity mvcc SYSTEM "mvcc.sgml"> +<!entity oper SYSTEM "oper.sgml"> +<!entity plan SYSTEM "plan.sgml"> +<!entity plperl SYSTEM "plperl.sgml"> +<!entity plsql SYSTEM "plsql.sgml"> +<!entity pltcl SYSTEM "pltcl.sgml"> +<!entity populate SYSTEM "populate.sgml"> +<!entity storage SYSTEM "storage.sgml"> +<!entity syntax SYSTEM "syntax.sgml"> +<!entity typeconv SYSTEM "typeconv.sgml"> <!-- reference pages --> <!entity % allfiles SYSTEM "allfiles.sgml"> @@ -108,10 +113,15 @@ Your name here... &indices; &array; &inherit; + &plsql; + &pltcl; + &plperl; &mvcc; &environ; &manage; &storage; + &plan; + &populate &commands; <!-- appendices -->