[erlang-bugs] erlang/odbc <-> ms-sql error with 'uniqueidentifiers' (aka GUIDs): ODBC_UNSUPPORTED_TYPE

Boris Mühmer <>
Sat Dec 10 08:36:47 CET 2011

Well, maybe I will be able to do such a user-contribution, because
either I get it running, find another way to access the Microsoft SQL
server from Erlang, or drop Erlang/OTP (nothing I want to do).

I started to have a closer look at "odbcserver.c". My first success
was to get a SELECT query with a GUID "working".

My question now is: what would be the "best" Erlang representation for a GUID?

The C structure behind a GUID is (found in "sqltypes.h"):
    typedef struct  tagSQLGUID
        DWORD Data1;
        WORD Data2;
        WORD Data3;
        BYTE Data4[ 8 ];
    } SQLGUID;

For my 1st hack I used the following statements to transform this
struct to an Erlang tuple:
        psg = (SQLGUID*)column.buffer;
        ei_x_encode_tuple_header(&dynamic_buffer(state), 4);
        ei_x_encode_ulong(&dynamic_buffer(state), psg->Data1);
        ei_x_encode_ulong(&dynamic_buffer(state), psg->Data2);
        ei_x_encode_ulong(&dynamic_buffer(state), psg->Data3);
        ei_x_encode_tuple_header(&dynamic_buffer(state), 8);
        for(i=0; i<8; i++){
            ei_x_encode_char(&dynamic_buffer(state), psg->Data4[i]);

For example, this conversion results in:
    19BCB12A-E6D1-4E58-A841-30F794C614FA =>

    703F9C47-F1B9-407E-847D-34840AC1E346 =>

Somewhat odd to see how the C struct looks and how Microsoft "displays" a GUID.

Should the Erlang representation be changed? Currently, I don't care
about how it is displayed; of course it would be nice to see something
more similar to the Microsoft way, on the other hand, it must't be
converted back in the c-driver. Would be a bit-string better? Or just
use a 128 Bit value?

I really like to get some input on this.

  - boris

2011/12/9 Ingela Anderton Andin <>:
> Hi!
> It seems to be a missing feature. Support for the data_type SQL_GUID is not
> implemented.
> I do not think it would be all that hard to implement but will not be highly
> prioritized by Ericsson.
> Maybe somebody would like to make a user-contribution?! You should start
> looking at the
> funtion encode_data_type in odbcserver.c
> Regards Ingela Erlang/OTP team - Ericsson AB
> Boris Mühmer wrote:
>> I try to connect to one of our companies Microsoft SQL databases using
>> Erlang/OTP R14B04 running on an Ubuntu 10.04 64 Bit installation
>> (using the FreeTDS drivers from the Ubuntu repositories).
>> The problem I have is, that the Erlang ODBC module can't handle
>> 'uniqueidentifier' (aka GUID) fields in tables. For example a 'select
>> *' doesn't work, but when I only select the non-uniqueidentifier
>> fields from the same table it works.
>> On the other hand, when I use the "isql" (commandline-)tool with the
>> same ODBC connection, I don't get any errors.
>> So I would say that something within the Erlang ODBC module is broken
>> (I believe it is in "odbcserver.c").
>> Is this a known bug, or did I miss anything?
>> Regards,
>> Boris
>> _______________________________________________
>> erlang-bugs mailing list
>> http://erlang.org/mailman/listinfo/erlang-bugs

More information about the erlang-bugs mailing list