Git Product home page Git Product logo

odbc-loader's Introduction

License test status

INTRODUCTION

This package contains two User-Defined Load functions, ODBCSource() and ODBCLoader(), that can be used to:

  • load data directly from a remote database
  • run queries against remote databases from Vertica (for example to join local Vertica-managed tables with MySQL, PostgreSQL, etc.)

Data retrieved from external databases is neither converted into an intermediate file formats nor landed to disk; the data is fetched over the network via ODBC and copied directly into Vertica as it is received. When used with Vertica versions 10.1 and above predicate pushdown and column filtering is applied to the remote database data extraction process.

INSTALLING / UNINSTALLING

Preprequisites

In order to install the ODBCLoader package you need to install on all nodes of your Vertica cluster:

  • an ODBC Driver Manager. This library has been tested with unixODBC. You need to install the development libraries (for example: yum install unixODBC-devel)
  • the ODBC Drivers to interface the remote databases
  • Perl Compatible Regular Expression library (yum install pcre-devel pcre-cpp)

In order to compile the ODBCLoader you also have to setup a development environment as defined in the standard documentation (Setting Up a Development Environment).

Building and installing the library

This operation has to be executed as dbadmin from one of the node of the cluster (Vertica will propagate the libraries across the cluster):

$ make
$ make install

Please check/modify ddl/install.sql to build the library "FENCED" or "UNFENCED"

Uninstalling the library

To remove the ODBCLoader library from your cluster:

$ make uninstall

Usage

The ODBCLoader can be used to load data from external databases or to query non-Vertica databases through external tables.

Data loading

The general syntax to load data from external databases via ODBCLoader is:

COPY myschema.myverticatable 
    WITH SOURCE ODBCSource() PARSER ODBCLoader(
        connect='DSN=some_odbc_dsn;<other connection parameters>',  
        query='select * from remote_table',
        [rowset=<number>]
    )
;

where rowset is an optional parameter to define the number of rows fetched from the remote database in each SQLFetch() call (default = 100). Increasing this parameter can improve the performance but will also increase memory usage.

This will cause Vertica to connect to the remote database identified by the given "connect" string and execute the given query. It will then fetch the results of the query and load them into the table myschema.myverticatable.

myverticatable must have the same number of columns as remote_table. The column types must also match up, or the ODBC driver for the remote database must be able to cast the column types to the Vertica types. If necessary, you can always explicitly cast on the remote side by modifying the query, or on the local side with a Vertica COPY expression.

The query argument to ODBCLoader can be any valid SQL query, or any other statement that the remote database will recognize and that will cause it to return a rowset.

The connect argument to ODBCLoader can be any valid ODBC connect string. It is common to configure /etc/odbc.ini and /etc/odbcinst.ini with all the necessary information, then simply reference the DSN listing in /etc/odbc.ini in each query. For help configuring these files, or for more information on valid 'connect' strings, please see the documentation that came with the ODBC driver for the remote database product that you are connecting to, as the format of the string is specified by the driver.

Federated queries

As we said we can use the ODBCLoader to run federated queries against other databases (for example to join Vertica tables with MySQL tables) taking advantage of both predicate pushdown and column pruning in order to move from the external database to Vertica only the data really needed.

To use this feature we Use Vertica External Tables as a gateway. Let's use an example to illustrate the process. External Tables, differently from Vertica-managed tables, leave the data outside Vertica In the following example we define an External Table in Vertica (public.epeople) retrieving data from the ODBC Data Source "pmf" through the query SELECT * FROM public.people:

CREATE  EXTERNAL  TABLE  public.epeople(
    id INTEGER,
    name VARCHAR(20)
) AS  COPY  WITH
    SOURCE  ODBCSource()
    PARSER  ODBCLoader(
        connect='DSN=pmf',
        query='SELECT * FROM public.people'
) ;

When you define the External Table nothing is retrieved from the external database; we just save - in Vertica - the information needed to extract the data from the external source.

Now, if we run, in Vertica, a query like this:

SELECT * FROM public.epeople WHERE id > 100;

The ODBCLoader will rewrite the original query defined in the previous External Table definition as follow:

SELECT id, name FROM public.people WHERE id > 100;

As you can see this query will pushdown the predicate to the external database.

The other important feature to limit the amount of data being moved from the external database to Vertica is columns pruning. This means we extract from the external database only the columns needed to run the query in Vertica. As we have to retrieve all columns defined in the External Table, the ones not needed in the Vertica query will be replaced by NULL. So, for example, if we run, in Vertica:

SELECT id FROM public.epeople WHERE id > 100;

the following query will be executed against the external database:

SELECT id, NULL FROM public.people WHERE id > 100;

Optional configuration switches

The ODBCLoader accept, in the External Table definition, the following, optional, configuration switches.

Amount of rows retrieved during each SQLFetch() iteration from the external database. The default value for this parameter is 100 and you can alter it in the CREATE EXTERNAL TABLE statement by defining a different rowset. For example:

CREATE  EXTERNAL  TABLE  public.epeople(
    id INTEGER,
    name VARCHAR(20)
) AS  COPY  WITH
    SOURCE  ODBCSource()
    PARSER  ODBCLoader(
        connect='DSN=pmf',
        query='SELECT * FROM public.people',
        rowset = 500
) ;

Please consider that increasing this parameter will also increase the memory consumption of the ODBCLoader.

You can switch predicate pushdown on/off with the optional boolean parameter src_rfilter. The default value is true (meaning we perform predicate pushdown). You can set src_rfilter either in the CREATE EXTERNAL TABLE statement or using a SESSION PARAMETER as follows:

ALTER SESSION SET UDPARAMETER FOR ODBCLoaderLib src_rfilter = false ;

You can switch columns filtering on/off with the optional boolean parameter src_cfilter. The default value is true (meaning we perform predicate pushdown). You can set src_cfilter either in the CREATE EXTERNAL TABLE statement or using a SESSION PARAMETER as follows:

ALTER SESSION SET UDPARAMETER FOR ODBCLoaderLib src_cfilter = false ;

You can overwrite the query defined in the original CREATE EXTERNAL TABLE statement using the session parameter override_query as follows:

ALTER SESSION SET UDPARAMETER FOR ODBCLoaderLib override_query = '
    SELECT * FROM people WHERE id % 2
'

The default length for session parameters is 2kB so, if your override_query is longer you might need to increase the session parameter max length before setting override_query. For example:

ALTER SESSION SET MaxSessionUDParameterSize = 16384 ;
ALTER SESSION SET UDPARAMETER FOR ODBCLoaderLib override_query = '
     SELECT 00 AS id, name, gender,bdate FROM mmf.mypeople UNION ALL 
     SELECT 01 AS id, name, gender,bdate FROM mmf.mypeople UNION ALL 
     SELECT 02 AS id, name, gender,bdate FROM mmf.mypeople UNION ALL
     SELECT 03 AS id, name, gender,bdate FROM mmf.mypeople UNION ALL
     SELECT 04 AS id, name, gender,bdate FROM mmf.mypeople UNION ALL
... long query here ...
'

Please note: session parameters are - of course - session-scoped. Have a look to the standard Vertica documentation to learn how to set/clear/check User-Defined Session Parameters.

Pushed-down predicates conversion

When pushing predicates down to the external database, ODBCLoader performs the following changes:

  1. Vertica specific data type casting ::<data type> will be removed
  2. ~~ will be converted to LIKE
  3. ANY(ARRAY) will be converted to IN(). For example ID = ANY(ARRAY[1,2,3]) will be converted to ID IN(1,2,3)

Database Specific Notes

ORACLE. All integers in Vertica are 64-bit integers. Oracle doesn't support 64-bit integers; their ODBC driver can't even cast to them on request. This code contains a quirk/workaround for Oracle that retrieves integers as C strings and re-parses them. However, the quirk doesn't reliably detect Oracle database servers right now. You can force Oracle with an obvious modification to the setQuirksMode() function in ODBCLoader.cpp. If you know of a more-reliable way to detect Oracle, or a better workaround, patches welcome :-)

MYSQL. The MySQL ODBC driver comes in both a thread-safe and thread-unsafe build and configuration. The thread-unsafe version is KNOWN TO CRASH VERTICA if used in multiple COPY statements concurrently! (Vertica is, after all, highly multithreaded). Linux distributions aren't consistently careful to package thread-safe defaults. So if you're connecting to MySQL, be very careful to set up a thread-safe configuration.

VERTICA. If you have to COPY data from one Vertica cluster to another use the Vertica's built-in IMPORT/EXPORT capabilities which are dramaticaly faster

DEBUGGING

ODBC layer tracing

The simpler way to check how the ODBCLoader rewrite the query sent to the external database is to enable ODBC traces in odbcinst.ini. For example:

[ODBC]
Trace=on
Tracefile=/tmp/uodbc.trc

And then grep the SQL from the trace file:

$ tail -f /tmp/uodbc.trc | grep 'SQL = '

Please remember to switch ODBC traces off at the end of your debug session because they will slowdown everything and create huge log files...

ODBC_Loader DEBUG

If the ODBC tracing was not enough you can (re)compie this library with LOADER_DEBUG flag set to 1 as shown here:

$ rm -rf build && make install LOADER_DEBUG=1

this will print extra messages in the Vertica log files (either UDxLogs/UDxFencedProcesses.log or vertica.log depending if the library was "FENCED" or "UNFENCED"). Caution: don't do this in production because it will flood your logs with debug messages and slowdown everything.

PCRE Missing symbols

The following error has been reported, during the deloyment phase, on a few Linux Distributions:

undefined symbol: _ZNK7pcrecpp2RE13GlobalReplaceERKNS_11StringPieceEPSs

To fix this issue you might want to...

STEP 1: get rid of the standard pcre packages: Remove pcre-devel and pcre-cpp packages (if installed) using the appropriate package management commands. For example:

# yum remove pcre-devel pcre-cpp

STEP 2: install PCRE from sources:

# tar xzvf pcre-8.45.tar.gz 
# cd pcre-8.45
# ./configure CXXFLAGS='-std=c++11 -D_GLIBCXX_USE_CXX11_ABI=0'
# make && make install

STEP 3: update you ld.so config and recreate its cache:

# echo "/usr/local/lib" > /etc/ld.so.conf.d/local.conf && rm /etc/ld.so.cache && ldconfig

But if existing version PCRE must be kept, you could...

STEP 1: install PCRE from sources to a dedicated location:

# tar xzvf pcre-8.45.tar.gz
# cd pcre-8.45
# ./configure CXXFLAGS='-std=c++11 -D_GLIBCXX_USE_CXX11_ABI=0' --prefix=/opt/pcre
# make && make install

STEP 2: set PATHs for PCRE header files and libraries:

echo 'export LD_LIBRARY_PATH=/opt/pcre/lib:${LD_LIBRARY_PATH}' >> /home/dbadmin/.bashrc

export CPLUS_INCLUDE_PATH=/opt/pcre/include:${CPLUS_INCLUDE_PATH}
export LIBRARY_PATH=/opt/pcre/lib:${LIBRARY_PATH}
export LD_LIBRARY_PATH=/opt/pcre/lib:${LD_LIBRARY_PATH}

# restart vertica database to effect settings
admintools -t stop_db -d testdb; admintools -t start_db -d testdb

# Building and installing the library as mentioned before

Sample ODBC Configurations

The following two configuration files odbc.ini and odbcinst.ini have been used to define two data sources: pmf to connect to PostgreSQL and mmf to connect to MySQL:

$ cat /etc/odbc.ini
[ODBC Data Sources]
PSQLODBC  = PostgreSQL ODBC
MYODBC  = MySQL ODBC

[pmf]
Description  = PostgreSQL mftest2
Driver = PSQLODBC
Trace  = No
TraceFile  = sql.log
Database = pmf
Servername = mftest2
UserName =
Password =
Port = 5432
SSLmode  = allow
ReadOnly = 0
Protocol = 7.4-1
FakeOidIndex = 0
ShowOidColumn  = 0
RowVersioning  = 0
ShowSystemTables = 0
ConnSettings =
Fetch  = 1000
Socket = 4096
UnknownSizes = 0
MaxVarcharSize = 1024
MaxLongVarcharSize = 8190
Debug  = 0
CommLog  = 0
Optimizer  = 0
Ksqo = 0
UseDeclareFetch  = 0
TextAsLongVarchar  = 1
UnknownsAsLongVarchar  = 0
BoolsAsChar  = 1
Parse  = 0
CancelAsFreeStmt = 0
ExtraSysTablePrefixes  = dd_
LFConversion = 0
UpdatableCursors = 0
DisallowPremature  = 0
TrueIsMinus1 = 0
BI = 0
ByteaAsLongVarBinary = 0
LowerCaseIdentifier  = 0
GssAuthUseGSS  = 0
XaOpt  = 1
UseServerSidePrepare = 0

[mmf]
Description  = MySQL mftest2
Driver = MYODBC
SERVER = mftest2
PORT = 3306
SQL-MODE = 'ANSI_QUOTES'

$ cat /etc/odbcinst.ini
[ODBC]
Trace=off
Tracefile=/tmp/uodbc.trc

[PSQLODBC]
Description=PostgreSQL ODBC Driver
Driver64=/usr/lib64/psqlodbcw.so
UsageCount=1

[MYODBC]
Driver=/usr/lib64/libmyodbc8w.so
UsageCount=1

[MySQL ODBC 8.0 ANSI Driver]
Driver=/usr/lib64/libmyodbc8a.so
UsageCount=1

License

Apache 2.0 License, please see LICENSE for details.

odbc-loader's People

Contributors

blackeyepanda avatar dingqiangliu avatar dmickens avatar mfelici avatar sitingren avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

odbc-loader's Issues

README: Perl-compatible regular expression library is required

To build this UDx, it has to install Perl-compatible regular expression library (pcre, pcre-cpp for RHEL compatible distributions) on the nodes. In addition, Development files for pcre (pcre-devel) is required when building it.

Please review this issue and add this requirements in README if necessary.

cannot make install, pls help!

make install

install ODBCLoader

Password:
vsql:ddl/install.sql:2: ROLLBACK 3399: Failure in UDx RPC call InvokeGetLibraryInfo(): Error calling setupExecContext() in User Defined Object [] at [/data/qb_workspaces/jenkins2/ReleaseBuilds/Hammermill/REL-10_1_1-x_hammermill/build/vertica/OSS/UDxFence/vertica-udx-C++.cpp:218], error code: 0, message: Error happened in dlopen(): [/home/dbadmin/ODBC-Loader-main/build/ODBCLoader.so: undefined symbol: _ZNK7pcrecpp2RE13GlobalReplaceERKNS_11StringPieceEPSs]
vsql:ddl/install.sql:3: ROLLBACK 3861: Library not found: ODBCLoaderLib
vsql:ddl/install.sql:4: ROLLBACK 3861: Library not found: ODBCLoaderLib
vsql:ddl/install.sql:7: ROLLBACK 2059: Source with specified name and parameters does not exist: ODBCSource
vsql:ddl/install.sql:8: ROLLBACK 2059: Parser with specified name and parameters does not exist: ODBCLoader

SQLDriverConnect() failed with error code 01000, native code 0 [[unixODBC][Driver Manager]Can't open lib '/usr/lib64/psqlodbcw.so' : file not found]

After the configuration of ODBC-Loader, I can "Federated queries" MySQL database.

But there is a error message for PostgreSQL 13, when I run query script
dbadmin=> SELECT * FROM public.devices;
ERROR 3399: Failure in UDx RPC call InvokeSetupUDL(): Error calling setupUDL() in User Defined Object [ODBCLoader] at [ODBCLoader.cpp:250], error code: 0, message: ODBC Error: SQLDriverConnect() failed with error code 01000, native code 0 [[unixODBC][Driver Manager]Can't open lib '/usr/lib64/psqlodbcw.so' : file not found]

####### ODBC-Loader debug log ######
/opt/vertica/itomdb/v_itomdb_node0001_catalog/UDxLogs/UDxFencedProcesses.log
2022-03-31 16:32:54.261 [C++-v_itomdb_node0001-3087:0x1d0226-3592203] 0x7f583bd8e700 [UserMessage] ODBCLoader - DEBUG Initial connect=<DSN=SA_postgresql>
2022-03-31 16:32:54.261 [C++-v_itomdb_node0001-3087:0x1d0226-3592203] 0x7f583bd8e700 [UserMessage] ODBCLoader - DEBUG Initial query=<select system_name,primary_ip from devices>
2022-03-31 16:32:54.261 [C++-v_itomdb_node0001-3087:0x1d0226-3592203] 0x7f583bd8e700 [UserMessage] ODBCLoader - DEBUG SETUP src_rfilter is true
2022-03-31 16:32:54.261 [C++-v_itomdb_node0001-3087:0x1d0226-3592203] 0x7f583bd8e700 [UserMessage] ODBCLoader - DEBUG SETUP src_cfilter is true
2022-03-31 16:32:54.261 [C++-v_itomdb_node0001-3087:0x1d0226-3592203] 0x7f583bd8e700 [UserMessage] ODBCLoader - DEBUG BEFORE GlobalReplace slist=<system_name,primary_ip>
2022-03-31 16:32:54.261 [C++-v_itomdb_node0001-3087:0x1d0226-3592203] 0x7f583bd8e700 [UserMessage] ODBCLoader - DEBUG AFTER GlobalReplace slist=<system_name,primary_ip> (length=22)
2022-03-31 16:32:54.262 [C++-v_itomdb_node0001-3087:0x1d0226-3592203] 0x7f583bd8e700 [UserMessage] ODBCLoader - DEBUG FINAL slist=system_name,primary_ip
2022-03-31 16:32:54.262 [C++-v_itomdb_node0001-3087:0x1d0226-3592203] 0x7f583bd8e700 [UserMessage] ODBCLoader - DEBUG query=SELECT system_name,primary_ip FROM ( select system_name,primary_ip from devices ) sq
2022-03-31 16:32:54.262 [C++-v_itomdb_node0001-3087:0x1d0226-3592203] 0x7f583bd8e700 [UserMessage] ODBCLoader - DEBUG rowset=100
2022-03-31 16:32:54.264 [C++-v_itomdb_node0001-3087:0x1d0226-3592203] 0x7f58410e5700 Error in recv(): Vertica process has closed the socket
2022-03-31 16:32:54.265 [C++-v_itomdb_node0001-3087:0x1d0226-3592203] 0x7f583b58d700 Error in recv(): Vertica process has closed the socket
2022-03-31 16:32:54.265 [C++-v_itomdb_node0001-3087:0x1d0226-3592203] 0x7f583bd8e700 Error in recv(): Vertica process has closed the socket

isql is workalbe

[dbadmin@mike5 ~]$ isql SA_postgresql -v
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> select system_name,primary_ip from devices;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+
| system_name | primary_ip |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+
| win2016tc.itom.mf | 172.16.111.84 |
| opsb202011e.itom.mf | 172.16.111.135 |
| sm.itom.mf | 172.16.111.41 |
| mike5.itom.mf | 172.16.111.155 |
| rhel83.itom.mf | 172.16.111.70 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+
SQLRowCount returns 5
5 rows fetched
SQL>

SQLDisconnect() failed with error code HY010

When I tried to copy the data from the remote Vertica database, I hit the following error:

=> COPY store_sales
->     WITH SOURCE ODBCSource() PARSER ODBCLoader(
(>         connect='DSN=Vertica',
(>         query='select * from store_sales'
(>     )
-> ;
ERROR 3399:  Failure in UDx RPC call InvokeDestroyUDL(): Error calling destroyUDL() in User Defined Object [ODBCLoader] at [ODBCLoader.cpp:250], error code: 0, message: ODBC Error: SQLDisconnect() failed with error code HY010, native code 0 [[unixODBC][Driver Manager]Function sequence error]

The log messages in vertica.log are as below:

2022-03-11 14:29:26.700 Init Session:0x7fb9741f4700 [Session] <INFO> [PQuery] TX:0(v_trial_node0001-3993:0x26e3) SELECT * FROM ( select * from store_sales ) sq
2022-03-11 14:29:26.700 Init Session:0x7fb9741f4700-a00000000012b6 [Txn] <INFO> Begin Txn: a00000000012b6 'SELECT * FROM ( select * from store_sales ) sq'
2022-03-11 14:29:26.701 Init Session:0x7fb9741f4700-a00000000012b6 [Session] <INFO> [BQuery] TX:a00000000012b6(v_trial_node0001-3993:0x26e3) SELECT * FROM ( select * from store_sales ) sq
2022-03-11 14:29:26.702 Init Session:0x7fb9741f4700-a00000000012b6 <LOG> @v_trial_node0001: 00000/3316: Executing statement: 'SELECT * FROM ( select * from store_sales ) sq'
2022-03-11 14:30:01.033 Init Session:0x7fb9741f4700-a00000000012b6 <LOG> @v_trial_node0001: 08006/5167: Unexpected EOF on client connection
2022-03-11 14:30:01.033 Init Session:0x7fb9741f4700-a00000000012b6 <LOG> @v_trial_node0001: 00000/4719: Session v_trial_node0001-3993:0x26e3 ended; closing connection (connCnt 1)
2022-03-11 14:30:01.033 Init Session:0x7fb9741f4700-a00000000012b6 [Txn] <INFO> Rollback Txn: a00000000012b6 'SELECT * FROM ( select * from store_sales ) sq'

The trace messages are as below:

[ODBC][116506][1646900363.989931][SQLDisconnect.c][208]
                Entry:
                        Connection = 0x7fc2e4008570
[ODBC][116506][1646900363.990464][SQLDisconnect.c][379]
                Exit:[SQL_ERROR]
                DIAG [25000] [Vertica][ODBC] (11120) Outstanding transactions during disconnect.

[ODBC][116506][1646900363.990571][SQLFreeHandle.c][290]
                Entry:
                        Handle Type = 2
                        Input Handle = 0x7fc2e4008570
[ODBC][116506][1646900363.990581][SQLFreeHandle.c][304]Error: HY010
[ODBC][116506][1646900363.990606][SQLFreeHandle.c][220]
                Entry:
                        Handle Type = 1
                        Input Handle = 0x7fc2e4007f70
[ODBC][116506][1646900363.990644][SQLFreeHandle.c][234]Error: HY010
[ODBC][116506][1646900363.990667][SQLGetDiagRec.c][677]
                Entry:
                        Connection = 0x7fc2e4008570
                        Rec Number = 1
                        SQLState = 0x7fc2f2c852a2
                        Native = 0x7fc2f2c8529c
                        Message Text = 0x7fc2f2c84e90
                        Buffer Length = 1024
                        Text Len Ptr = 0x7fc2f2c8529a
[ODBC][116506][1646900363.990692][SQLGetDiagRec.c][726]
                Exit:[SQL_SUCCESS]
                        SQLState = HY010
                        Native = 0x7fc2f2c8529c -> 0
                        Message Text = [[unixODBC][Driver Manager]Function sequence error]

This happens if auto commit is disabled.

real column pruning

Hello!ย 

I'm using your example with hidden query_col_name and pred_XX params to build connectors to other storages (clickhouse,orc,mysql,mongodb,...). I succeed in pruing columns while reading from the source, but I still have to pass them filled with nulls through the Vertica SDK. And in my case, it is very time-consuming too. If I query a single column out of external table with 20 columns, it can be 10 times slower than fetching a single column out of external table with only one column.

I saw there is a getParserReturnType method, but it is only a column precision that can be changed from there. I also saw a RLETuple type and guess it is possible to avoid passing nulls by encoding them into RLE, but SDK does not support RLETuple as a type for UDx developers. So for now, I came up with using RLE-like groupping inside UDx with an extra column for count. Another thought is to use arrays to prune columns.

Can you please guide me on whether it is possible to remove null columns from the UDParser output to get better perfomance?

g++ can not link libpcre and libpcrecpp to ODBCLoader.so

dbadmin@DellofDQ:/opt/vertica/packages/ODBC-Loader$ make
mkdir -p ./lib
g++ -I /opt/vertica/sdk/include -I /opt/vertica/sdk/examples/HelperLibraries -fPIC -shared -Wall -g -std=c++11 -lpcrecpp -lpcre -D_GLIBCXX_USE_CXX11_ABI=0 -DLOADER_DEBUG=0 -o lib/ODBCLoader.so /opt/vertica/sdk/include/Vertica.cpp ODBCLoader.cpp -lodbc
dbadmin@DellofDQ:/opt/vertica/packages/ODBC-Loader$ ldd lib/ODBCLoader.so
linux-vdso.so.1 (0x00007ffd311b4000)
libodbc.so.2 => /lib/x86_64-linux-gnu/libodbc.so.2 (0x00007febcfc2b000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007febcfa00000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007febcf9e0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007febcf600000)
libltdl.so.7 => /lib/x86_64-linux-gnu/libltdl.so.7 (0x00007febcf9d5000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007febcf8ec000)
/lib64/ld-linux-x86-64.so.2 (0x00007febcfd98000)

dbadmin@DellofDQ:/opt/vertica/packages/ODBC-Loader$ g++ --version
g++ (Ubuntu 7.5.0-6ubuntu2) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

dbadmin@DellofDQ:/opt/vertica/packages/ODBC-Loader$ uname -a
Linux DellofDQ 5.19.0-45-generic #46~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Jun 7 15:06:04 UTC 20 x86_64 x86_64 x86_64 GNU/Linux

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.