[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 =>
        {{431796522,59089,20056,{168,65,48,247,148,198,20,250}}

    703F9C47-F1B9-407E-847D-34840AC1E346 =>
        {1883216967,61881,16510,{132,125,52,132,10,193,227,70}}

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