<!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/set.sgml,v 1.28 1999/07/22 15:09:15 thomas Exp $
Postgres documentation
-->

<refentry id="SQL-SET">
 <refmeta>
  <refentrytitle id="SQL-SET-TITLE">
   SET
  </refentrytitle>
  <refmiscinfo>SQL - Language Statements</refmiscinfo>
 </refmeta>
 <refnamediv>
  <refname>
   SET
  </refname>
  <refpurpose>
   Set run-time parameters for session
  </refpurpose>
 </refnamediv>
 <refsynopsisdiv>
  <refsynopsisdivinfo>
   <date>1999-07-20</date>
  </refsynopsisdivinfo>
  <synopsis>
SET <replaceable class="PARAMETER">variable</replaceable> { TO | = } { '<replaceable class="PARAMETER">value</replaceable>' | DEFAULT }
SET TIME ZONE { '<replaceable class="PARAMETER">timezone</replaceable>' | LOCAL | DEFAULT }
SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE }
  </synopsis>

  <refsect2 id="R2-SQL-SET-1">
   <refsect2info>
    <date>1998-09-24</date>
   </refsect2info>
   <title>
    Inputs
   </title>
   <para>
		
    <variablelist>
     <varlistentry>
      <term><replaceable class="PARAMETER">variable</replaceable></term>
      <listitem>
       <para>
	Settable global parameter.
       </para>
      </listitem>
     </varlistentry>
     <varlistentry>
      <term><replaceable class="PARAMETER">value</replaceable></term>
      <listitem>
       <para>
	New value of parameter.
       </para>
      </listitem>
     </varlistentry>
    </variablelist>
   </para>

   <para>
    The possible variables and allowed values are:
		
    <variablelist>
     <varlistentry>
      <term>CLIENT_ENCODING | NAMES</term>
      <listitem>
       <para>
	Sets the multi-byte client encoding. Parameters are:
	
	<variablelist>
	 <varlistentry>
	  <term><replaceable class="parameter">value</replaceable></term>
	  <listitem>
	   <para>
	    Sets the multi-byte client encoding to
	    <replaceable class="parameter">value</replaceable>.
	    The specified encoding must be supported by the backend.
	   </para>
	  </listitem>
	 </varlistentry>
	 
	 <varlistentry>
	  <term>DEFAULT</term>
	  <listitem>
	   <para>
	    Sets the multi-byte client encoding to the default value.
	   </para>
	  </listitem>
	 </varlistentry>
	</variablelist>
       </para>

       <para>
	This is only enabled if multi-byte was specified to configure.
       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>DateStyle</term>
      <listitem>
       <para>
	Set the date/time representation style. Affects the output format,
	and in some cases it can affect the interpretation of input.

	<variablelist>
	 <varlistentry>
	  <term>ISO</term>
	  <listitem>
	   <para>
	    use ISO 8601-style dates and times
	   </para>
	  </listitem>
	 </varlistentry>
	 <varlistentry>
	  <term>SQL</term>
	  <listitem>
	   <para>
	    use Oracle/Ingres-style dates and times
	   </para>
	  </listitem>
	 </varlistentry>
	 <varlistentry>
	  <term>Postgres</term>
	  <listitem>
	   <para>
	    use traditional <productname>Postgres</productname> format
	   </para>
	  </listitem>
	 </varlistentry>
	 <varlistentry>
	  <term>European</term>
	  <listitem>
	   <para>
	    use dd/mm/yyyy for numeric date representations.
	   </para>
	  </listitem>
	 </varlistentry>
	 <varlistentry>
	  <term>NonEuropean</term>
	  <listitem>
	   <para>
	    use mm/dd/yyyy for numeric date representations.
	   </para>
	  </listitem>
	 </varlistentry>
	 <varlistentry>
	  <term>German</term>
	  <listitem>
	   <para>
	    use dd.mm.yyyy for numeric date representations.
	   </para>
	  </listitem>
	 </varlistentry>
	 <varlistentry>
	  <term>US</term>
	  <listitem>
	   <para>
	    same as 'NonEuropean'
	   </para>
	  </listitem>
	 </varlistentry>
	 <varlistentry>
	  <term>DEFAULT</term>
	  <listitem>
	   <para>
	    restores the default values ('US,Postgres')
	   </para>
	  </listitem>
	 </varlistentry>
	</variablelist>
       </para>

       <para>
	Date format initialization may be done by:
	<simplelist>
	 <member>
	  Setting the <envar>PGDATESTYLE</envar> environment variable.
	 </member>
	 <member>
	  Running postmaster using the option <option>-o -e</option> to set
	  dates to the <literal>European</literal> convention.
	  Note that this affects only some combinations of date styles; for example
	  the ISO style is not affected by this parameter.
	 </member>
	 <member>
	  Changing variables in 
	  <filename>src/backend/utils/init/globals.c</filename>.
	 </member>
	</simplelist>
       </para>
       <para>
	The variables in <filename>globals.c</filename> which can be changed are:
	<simplelist>
	 <member>
	  bool EuroDates = false | true
	 </member>
	 <member>
	  int  DateStyle = USE_ISO_DATES | USE_POSTGRES_DATES | USE_SQL_DATES | USE_GERMAN_DATES
	 </member>
	</simplelist>
       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>SERVER_ENCODING</term>
      <listitem>
       <para>
	Sets the multi-byte server encoding
	
	<variablelist>
	 <varlistentry>
	  <term><replaceable class="parameter">value</replaceable></term>
	  <listitem>
	   <para>
	    Sets the multi-byte server encoding.
	   </para>
	  </listitem>
	 </varlistentry>
	 
	 <varlistentry>
	  <term>DEFAULT</term>
	  <listitem>
	   <para>
	    Sets the multi-byte server encoding.
	   </para>
	  </listitem>
	 </varlistentry>
	</variablelist>
       </para>
       <para>
	This is only enabled if multi-byte was specified to configure.
       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>TIMEZONE</term>
      <listitem>
       <para>
	The possible values for timezone depends on your operating
	system. For example on Linux /usr/lib/zoneinfo contains the
	database of timezones.
       </para>
       <para>
	Here are some valid values for timezone:
				
	<variablelist>
	 <varlistentry>
	  <term>'PST8PDT'</term>
	  <listitem>
	   <para>
	    set the timezone for California
	   </para>
	  </listitem>
	 </varlistentry>
	 <varlistentry>
	  <term>'Portugal'</term>
	  <listitem>
	   <para>
	    set time zone for Portugal.
	   </para>
	  </listitem>
	 </varlistentry>
	 <varlistentry>
	  <term>'Europe/Rome'</term>
	  <listitem>
	   <para>
	    set time zone for Italy.
	   </para>
	  </listitem>
	 </varlistentry>
	 <varlistentry>
	  <term>DEFAULT</term>
	  <listitem>
	   <para>
	    set time zone to your local timezone
	    (value of the TZ environment variable).
	   </para>
	  </listitem>
	 </varlistentry>
	</variablelist>
       </para>
       <para>
	If an invalid time zone is specified, the time zone
	becomes GMT (on most systems anyway).
       </para>
       <para>
	A frontend which uses libpq may be initialized by setting the PGTZ
	environment variable.
       </para>
       <para>
	The second syntax shown above, allows one to set the timezone
	with a syntax similar to SQL92 <command>SET TIME ZONE</command>.
	The LOCAL keyword is just an alternate form
	of DEFAULT for SQL92 compatibility.
       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>TRANSACTION ISOLATION LEVEL</term>
      <listitem>
       <para>
	Sets the isolation level for the current transaction.
	
	<variablelist>
	 <varlistentry>
	  <term>READ COMMITTED</term>
	  <listitem>
	   <para>
	    The current transaction queries read only rows committed
	    before a query began. READ COMMITTED is the default.
	   </para>

	   <note>
	   <para>
	    <acronym>SQL92</acronym> standard requires 
	    SERIALIZABLE to be the default isolation level.
	   </para>
	   </note>
	  </listitem>
	 </varlistentry>
	 
	 <varlistentry>
	  <term>SERIALIZABLE</term>
	  <listitem>
	   <para>
	    The current transaction queries read only rows committed
	    before first DML statement 
	    (<command>SELECT/INSERT/DELETE/UPDATE/FETCH/COPY_TO</command>)
	    was executed in this transaction. 
	   </para>
	  </listitem>
	 </varlistentry>
	 
	</variablelist>
       </para>
      </listitem>
     </varlistentry>
    </variablelist>
   </para>

   <para>
    There are also several internal or optimization
    parameters which can be specified
    by the <command>SET</command> command:
    
    <variablelist>
     <varlistentry>
      <term>COST_HEAP</term>
      <listitem>
       <para>
	Sets the default cost of a heap scan for use by the optimizer.
	
	<variablelist>
	 <varlistentry>
	  <term><replaceable class="parameter">float4</replaceable></term>
	  <listitem>
	   <para>
	    Set the cost of a heap scan to the specified floating point value.
	   </para>
	  </listitem>
	 </varlistentry>
	 
	 <varlistentry>
	  <term>DEFAULT</term>
	  <listitem>
	   <para>
	    Sets the cost of a heap scan to the default value.
	   </para>
	  </listitem>
	 </varlistentry>
	</variablelist>
       </para>
       <para>
	The frontend may be initialized by setting the PGCOSTHEAP
	environment variable.
       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>COST_INDEX</term>
      <listitem>
       <para>
	Sets the default cost of an index scan for use by the optimizer.

	<variablelist>     
	 <varlistentry>
	  <term><replaceable class="parameter">float4</replaceable></term>
	  <listitem>
	   <para>
	    Set the cost of an index scan to the specified floating point value.
	   </para>
	  </listitem>
	 </varlistentry>
	 
	 <varlistentry>
	  <term>DEFAULT</term>
	  <listitem>
	   <para>
	    Sets the cost of an index scan to the default value.
	   </para>
	  </listitem>
	 </varlistentry>
	</variablelist>
       </para>

       <para>
	The frontend may be initialized by setting the PGCOSTINDEX
	environment variable.
       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>GEQO</term>
      <listitem>
       <para>
	Sets the threshold for using the genetic optimizer algorithm.

	<variablelist>
	 <varlistentry>
	  <term>ON</term>
	  <listitem>
	   <para>
	    enables the genetic optimizer algorithm
	    for statements with 6 or more tables.
	   </para>
	  </listitem>
	 </varlistentry>

	 <varlistentry>
	  <term>ON=<replaceable class="parameter">#</replaceable></term>
	  <listitem>
	   <para>
	    Takes an integer argument to enable the genetic optimizer algorithm
	    for statements with <replaceable class="parameter">#</replaceable>
	    or more tables in the query.
	   </para>
	  </listitem>
	 </varlistentry>

	 <varlistentry>
	  <term>OFF</term>
	  <listitem>
	   <para>
	    disables the genetic optimizer algorithm.
	   </para>
	  </listitem>
	 </varlistentry>
	 <varlistentry>
	  <term>DEFAULT</term>
	  <listitem>
	   <para>
	    Equivalent to specifying <command>SET GEQO='ON'</command>
	   </para>
	  </listitem>
	 </varlistentry>
	</variablelist>
       </para>

       <para>
	This algorithm is on by default, which used GEQO for
	statements of eleven or more tables.
	(See the chapter on GEQO in the Programmer's Guide
	for more information).
       </para>
       <para>
	The frontend may be initialized by setting PGGEQO
	environment variable.
       </para>
       <para>
	It may be useful when joining big relations with
	small ones. This algorithm is off by default.
	It's not used by GEQO anyway.
       </para>
      </listitem>
     </varlistentry>

     <varlistentry>
      <term>KSQO</term>
      <listitem>
       <para>
	<firstterm>Key Set Query Optimizer</firstterm> forces the query optimizer
	to optimize repetative OR clauses such as generated by
	<productname>MicroSoft Access</productname>:
       
	<variablelist>
	 <varlistentry>
	  <term>ON</term>
	  <listitem>
	   <para>
	    enables this optimization.
	   </para>
	  </listitem>
	 </varlistentry>
	
	 <varlistentry>
	  <term>OFF</term>
	  <listitem>
	   <para>
	    disables this optimization.
	   </para>
	  </listitem>
	 </varlistentry>
	 
	 <varlistentry>
	  <term>DEFAULT</term>
	  <listitem>
	   <para>
	    Equivalent to specifying <command>SET KSQO='OFF'</command>.
	   </para>
	  </listitem>
	 </varlistentry>
	</variablelist>
       </para>

       <para>
	It may be useful when joining big relations with
	small ones. This algorithm is off by default.
	It's not used by GEQO anyway.
       </para>
       <para>
	The frontend may be initialized by setting the PGKSQO
	environment variable.
       </para>
      </listitem>
     </varlistentry>

    </variablelist>
   </para>
  </refsect2>

  <refsect2 id="R2-SQL-SET-2">
   <refsect2info>
    <date>1998-09-24</date>
   </refsect2info>
   <title>
    Outputs
   </title>
   <para>
    
    <variablelist>
     <varlistentry>
      <term><computeroutput>
SET VARIABLE
       </computeroutput></term>
      <listitem>
       <para>
	Message returned if successfully.
       </para>
      </listitem>
     </varlistentry>
     
     <varlistentry>
      <term><computeroutput>
WARN:  Bad value for <replaceable class="parameter">variable</replaceable> (<replaceable class="parameter">value</replaceable>)
       </computeroutput></term>
      <listitem>
       <para>
	If the command fails to set the specified variable.
       </para>
      </listitem>
     </varlistentry>
     
    </variablelist>
   </para>
  </refsect2>
 </refsynopsisdiv>
 
 <refsect1 id="R1-SQL-SET-1">
  <refsect1info>
   <date>1998-09-24</date>
  </refsect1info>
  <title>
   Description
  </title>
  <para>
   <command>SET</command> will modify configuration parameters for variable during
   a session.
  </para>
  <para>
   Current values can be obtained using <command>SHOW</command>, and values
   can be restored to the defaults using <command>RESET</command>.
   Parameters and values are case-insensitive. Note that the value
   field is always specified as a string, so is enclosed in
   single-quotes.
  </para>
  <para>
   <command>SET TIME ZONE</command> changes the session's
   default time zone offset.
   An SQL-session always begins with an initial default time zone
   offset.
   The <command>SET TIME ZONE</command> statement is used to change the default
   time zone offset for the current SQL session.
  </para>
  
  <refsect2 id="R2-SQL-SET-3">
   <refsect2info>
    <date>1998-09-24</date>
   </refsect2info>
   <title>
    Notes
   </title>
   <para>
    The <command>SET <replaceable class="parameter">variable</replaceable></command>
    statement is a <productname>Postgres</productname> language extension.
   </para>
   <para>
    Refer to <command>SHOW</command> and <command>RESET</command> to 
    display or reset the current values.
   </para>
  </refsect2>
 </refsect1>
 
 <refsect1 id="R1-SQL-SET-2">
  <title>
   Usage
  </title>
  <para>
   Set the style of date to ISO:
   
   <programlisting>
SET DATESTYLE TO 'ISO';
   </programlisting>

   Enable GEQO for queries with 4 or more tables:

   <programlisting> 
SET GEQO ON=4;
   </programlisting>

   Set GEQO to default:

   <programlisting> 
SET GEQO = DEFAULT;
   </programlisting>

   Set the timezone for Berkeley, California:

   <programlisting> 
SET TIME ZONE 'PST8PDT';
SELECT CURRENT_TIMESTAMP AS today;
   
   today
   ----------------------
   1998-03-31 07:41:21-08
   </programlisting>

   Set the timezone for Italy:

   <programlisting> 
SET TIME ZONE 'Europe/Rome';
SELECT CURRENT_TIMESTAMP AS today;
   
   today
   ----------------------
   1998-03-31 17:41:31+02
   </programlisting>
  </para>
 </refsect1>

 <refsect1 id="R1-SQL-SET-3">
  <title>
   Compatibility
  </title>
  
  <refsect2 id="R2-SQL-SET-4">
   <refsect2info>
    <date>1998-09-24</date>
   </refsect2info>
   <title>
    SQL92
   </title>
   <para>
    There is no general
    <command>SET <replaceable class="parameter">variable</replaceable></command>
    in <acronym>SQL92</acronym> (with the exception of
    <command>SET TRANSACTION ISOLATION LEVEL</command>).

    The <acronym>SQL92</acronym> syntax for <command>SET TIME ZONE</command>
    is slightly different,
    allowing only a single integer value for time zone specification:
    
    <synopsis>
SET TIME ZONE { interval_value_expression | LOCAL }
    </synopsis>
   </para>
  </refsect2>
 </refsect1>
</refentry>

<!-- 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:
-->
