On 6 Apr 2003 at 19:41, Tom Lane wrote:
> This behavior is, quite simply, not possible.  Unless perhaps you are
> issuing the two queries across different connections, so that the
> second one actually starts to execute before the first one is done.
I've tried to ensure that the two queries are run by the same
backend. I'm using Delphi 6 to manipulate ADO, which talks to
Postgres via ODBC. The code of the specific procedure which seems to
be misbehaving is given below - as you'll see, the two queries are
built as a single string and so are executed together when
TheQry.Open is called.
>  If you are (mis)using a client library that implements pooling of
> connections, I can see how such a mistake might happen.
The connection pooling is handled by ODBC.
--Ray.
-----[Delphi code follows]------
function TDatabaseLink.CountApplicantsAvailable(const CourseCode:
WideString): Integer;
var
  Conn: TADOConnection;
  TheQry: TADOQuery;
begin
  Conn := TADOConnection.Create(nil);
  TheQry := TADOQuery.Create(nil);
  try
    Conn.ConnectionString := ADOConnStr; // defined elsewhere
    Conn.Open;
    TheQry.Connection := Conn;
    TheQry.SQL.Text := 'begin; ';
    // add the UPDATE query
    TheQry.SQL.Add('update applications set status=' +
MakeIntegerStr(statAvailable + statChoice2)
      + ' where applicationnumber in '
      + '(select applicationnumber from applications a inner join
courses c on (a.choice1=c.coursecode) '
      + 'where (a.choice2=' + QuotedStr(CourseCode) + ') '
      + 'and (c.isfull=' + MakeBooleanStr(true) + ') '
      + 'and (a.status=' + MakeIntegerStr(statAvailable +
statChoice1) + ')'
      + '); ');
    TheQry.SQL.Add('commit; ');
    // add the SELECT query
    TheQry.SQL.Add('select count(applicationnumber) from applications
'
      + 'where (choice1=' + QuotedStr(CourseCode) + ' and status=' +
MakeIntegerStr(statAvailable + statChoice1) + ') '
      + 'or (choice2=' + QuotedStr(CourseCode) + ' and status=' +
MakeIntegerStr(statAvailable + statChoice2) + ') '
      + 'or (choice3=' + QuotedStr(CourseCode) + ' and status=' +
MakeIntegerStr(statAvailable + statChoice3) + ');');
    // execute the query
    TheQry.Open;
    Result := TheQry.Fields[0].AsInteger;
  finally
    TheQry.Close;
    TheQry.Free;
    Conn.Close;
    Conn.Free;
  end;
end;
-------------------------------------------------------------
Raymond O'Donnell     http://www.galwaycathedral.org/recitals
rod@iol.ie                          Galway Cathedral Recitals
-------------------------------------------------------------