Null Characters in Strings, Version 9.3.1

From: Nils Gösche <cartan(at)cartan(dot)de>
To: <pgsql-odbc(at)postgresql(dot)org>
Subject: Null Characters in Strings, Version 9.3.1
Date: 2014-02-13 17:53:20
Message-ID: 006a01cf28e4$7c425450$74c6fcf0$@de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-odbc

Hi!

I have noticed a change of behavior in version 9.3.1 of the ODBC driver. I am using the 32 bit version for testing, haven’t tried 64 bit yet.

I am retrieving a string value from a table that has a column of type ‘text’. This worked just fine with version 9.2.1 of the driver, but since I upgraded the ODBC driver to 9.3.1, something strange is happening:

In psql, I do:

select length(body) from macros where name = 'check_pruefziffer';

and it returns 459. The text contains only ASCII characters.

If I retrieve the value in a C# program using the ODBC driver, I get a string that has a null character at position 459, but a total length of 487! The string up to position 458 is correct, but has now been extended with a null character and a few junk characters.

This shouldn’t be happening, right? Am I doing something wrong here? Here is some C# code that I wrote for testing:

class Program
{
const string ConnString = @"Driver={PostgreSQL Unicode};server=localhost;port=5432;database=...;uid...;pwd=...";

static void Main(string[] args)
{
try
{
using (var db = new OdbcConnection(ConnString))
{
db.Open();
using (var trans = db.BeginTransaction())
{
try
{
const string cmdText = @"SELECT body FROM macros WHERE name = 'check_pruefziffer'";
using (var cmd = new OdbcCommand(cmdText, db, trans))
{
var ret = cmd.ExecuteScalar();
if (ret == null)
{
Console.WriteLine("ret == null");
}
else
{
Console.WriteLine("ret is {0}: {1}", ret.GetType(), ret);
Console.WriteLine("\nChecking for null byte...");
string s = (string) ret;
int pos = s.IndexOf('\0');
if (pos >= 0)
{
Console.WriteLine("Found null byte at {0}! Total = {1}", pos, s.Length);
}
else
{
Console.WriteLine("Not found.");
}
}
}
trans.Commit();
}
catch
{
trans.Rollback();
throw;
}
}
}
}
catch (Exception ex)
{
Console.Error.WriteLine("{0}: {1}", ex.GetType().Name, ex.Message);
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey(true);
}
}

Here is the tail of the output:

[SNIP]

$computedZiffer = 10 - ($sum % 10)

if ($computedZiffer -eq $pruefZiffer) { $ret = $true }
}
$ret ) { $ret = $true }
}
$ret

Checking for null byte...
Found null byte at 459! Total = 487
Press any key to exit...

If you select the same value in psql, the tail looks like this:

[SNIP]
+
$computedZiffer = 10 - ($sum % 10) +
+
if ($computedZiffer -eq $pruefZiffer) { $ret = $true } +
} +
$ret
(1 row)

The string that the C# program is getting contains a null byte plus some junk after the $ret.

Regards,
--
Nils Gösche
"Don't ask for whom the <CTRL-G> tolls."

Responses

Browse pgsql-odbc by date

  From Date Subject
Next Message Heikki Linnakangas 2014-02-13 20:39:32 Re: 09.03.0100 cursor failures on various architectures
Previous Message Christoph Berg 2014-02-12 10:45:24 09.03.0100 cursor failures on various architectures