Thursday July 7, 2022

ODBCdL4 for Windows Driver 1.8.2 Maintenance Release
All Rights Reserved.  Copyright (c) 2005 - 2022 by:
Dynamic Concepts, Inc. Irvine, CA 92618 USA


Email address:  techsupport@dynamic.com
Information:    www.unibasic.com
Downloads:      www.unibasic.com or ftp.dynamic.com


Pre-installation instructions
=============================

o   Due to network protocol changes, this version of the ODBCdL4 Driver for
    Windows cannot be used with older beta versions of the ODBCdL4 server.
    All servers must be upgraded to version 1.1 or later of the ODBCdL4
    server.

o   ODBCdL4 Driver for Windows must be used with the ODBCdL4 Server.

o   This release requires that the ODBCdL4 server have an SSN authorized
    for release 1 of ODBCdL4 and the expected number of users.  Without
    such an SSN, ODBCdL4 cannot be used.

o   Problem reports should be emailed to techsupport@dynamic.com.  All problem
    reports should contain a description of the problem, the operating 
    system name/revision, and, if at all possible, a reproducible sequence 


Installation instructions
=========================

The installation should be performed on an administrator account.  There
are three ways to install the ODBCdL4 drivers for Windows:

    1. Run 1B_odbcdl4_1.8.2.exe which installs both the 32 bit and the
       64 bit drivers.  To run the installer without prompts or displays,
       add a "/s" command line option.

    2. Run 1B_odbcdl4_1.8.2.msi which install the 32 bit driver.  Standard
       MSI command line options are supported.

    3. Run 1B_odbcdl4x64_1.8.2.msi which install the 64 bit driver. Standard
       MSI command line options are supported.

When making or creating ODBC connections, specify the DNS name or IP address
of the ODBCdL4 server as the "host" and use 9635 as the port number (or, if
the server uses a different port, use that port number).  On 64-bit versions
of Windows, both 32-bit and 64-bit ODBCdL4 drivers are installed.

Please note that on 64-bit Windows operating systems, 64-bit applications use
only 64-bit DSNs and 32-bit applications use only 32-bit DSNs.  To create or
modify a 64-bit DSN, use the standard ODBC administrator utility.  To create
or modify a 32-bit DSN on a 64-bit operating system, use the 32-bit ODBC
administrator which is named odbcad32.exe and can be found in the system
\Windows\SysWow64 directory.  If the ODBC administrator utility shows the
ODBCdL4 driver as "ODBC dL4 Driver 32", then you are using the 32-bit utility.
If the utility shows the driver as "ODBC dL4 Driver 64", then you are using
the 64-bit utility.


Acknowledgements
==========================

This product includes software developed by the OpenSSL Project for use in
the OpenSSL Toolkit (http://www.openssl.org/).  The OpenSSL license file and
copyright notice is included in the file credits.txt.


File list
=========

readme.txt          This file
license.txt         Runtime license terms and conditions      
credits.txt         OpenSSL license and copyright information
odbcdl4.dll         32-bit ODBC Runtime library
od64dl4.dll         64-bit ODBC Runtime library


Highlights of This Release
==========================

o   The drivers are available in MSI installation files.

o   All network traffic can be encrypted after the initial negotiation.


New in This Release
=================================================================

Jul  7 2022 (Maintenance Release 1.8.2

o   The ODBCdL4 Driver installer is now available as signed MSI files.
    There are separate MSI installers for the 32 bit and 64 bit drivers.

Oct 22 2020 (Maintenance Release 1.8.1

o   ODBCdL4 Driver for Windows is now compiled and linked using Microsoft 
    Visual Studio 2019.  Windows versions prior to Windows 7 are no longer 
    supported.

Dec  9 2019 (Release 1.8

o   SQL JOIN performance has been improved when using ODBCdL4 Server 1.8
    or later with the ODBCdL4 Driver 1.8 or later.

o   The ODBC SQLStatistics() function now returns information on all indexes
    defined in a table definition file.  ODBCdL4 has always used all of the
    index definitions, but the definitions were not visible to ODBC 
    applications.  This enhancement requires use of the current releases of
    both the ODBCdL4 Server and the ODBCdL4 Driver.

o   The SQL intrinsic functions, such as LENGTH, can now be used with columns
    and arguments of up to 1100 characters.

Oct 31 2017 (Release 1.7)

o   The ODBCdL4 driver now uses TLS/SSL encryption with the ODBCdL4 server
    after the initial connection if the server is version 1.6 or later.  If
    the server is older than version 1.6, all communication with that server
    will use clear text.  Please note that TLS/SSL certificates are not used
    by the server and there is no protection against man-in-the-middle
    attacks.

Feb  6 2017 (Maintenance Release 1.6.7)

o   Bug fixed: queries to ODBCdL4 linker servers failed in Microsoft SQL
    Server 2016 unless the result set was empty.

Jan 31 2017 (Maintenance Release 1.6.6)

o   The word "OUTER" in "LEFT OUTER JOIN" is now optional.

o   The ODBC SQLStatistics function now returns the database name and
    table name instead of "" or NULL.

Dec 12 2011 (Maintenance Release 1.6.5)

o   A DSN option has been added to enable or disable debug logging of
    ODBCdL4 activity on the server.  This option should only be used when
    directed by Dynamic Concepts support personnel.

Oct 26 2011 (Maintenance Release 1.6.4)

o   The OLE Provider for ODBC in Windows 2008R2 appears to have a bug that
    causes a memory violation when used with ODBCdL4.  Since SQL Server
    Linked Servers require using the OLE Provider, a new ODBCdL4 DSN option,
    "Use OLE Workaround", has been implemented to avoid the OLE bug.  When
    creating a DSN for use with an SQL Server Linked Server, set the "Use
    OLE workaround" check box to enable the option.  The OLE workaround
    option should only be enabled in DSNs that are used with SQL Server
    Linked Servers.  The option can be added to an existing DSN by using
    the ODBC Administrator.

Aug  3 2011 (Maintenance Release 1.6.3)

o   Bug fixed: the SQL Server administrator utility displayed duplicate 
    databases and tables for ODBCdL4 Linked Servers.

Aug 12 2010 (Maintenance Release 1.6.2)

o   Improve connection failed error messages.

Apr  6 2010 (Maintenance Release 1.6.1)

o   Bug fixed: fixed a memory leak.

Mar 15 2010 (Release 1.6)

o   On 64-bit Windows operating systems, a 64-bit version of the ODBCdL4
    driver is installed for use with 64-bit applications.  The 32-bit version
    of the driver is installed on both 64-bit and 32-bit Windows for use by
    32-bit applications.

o   ODBCdL4 now supports bracketed identifiers as in Microsoft SQL Server.
    This addition increases compatibility with Visual Studio 2005/2008
    which uses this non-standard syntax in some ODBC wizards.

o   Bug fixed: fix problem with Visual Studio 2008 that prevented the data
    wizard from being able to setup ODBCdL4 connections.

Dec 15 2009 (Maintenance Release 1.5.2)

o   Bug fixed: fix problem with the ODBC Administrator on Windows 7: the
    administrator utility (odbcad32.exe) crashed when creating a file DSN.

May 27 2009 (Maintenance Release 1.5.1)

o   Improve compatibility with the "Preview" button of the Excel ODBC 
    connection setup wizard.

Nov 20 2008 (Production Release 1.5)

o   Improve performance for queries using the IN or BETWEEN operators.  This
    feature requires release 1.5 or later of the ODBCdL4 server.

o   Increase compatibility with the Excel Data Wizard and some other ODBC
    configuration utilities.

Jun 10 2008 (Production Release 1.4)

o   Improve performance for queries using OR conditions.  This feature
    requires release 1.5 or later of the ODBCdL4 server.

o   Improve performance for some Microsoft Access applications.  This feature
    requires release 1.5 or later of the ODBCdL4 server.

Apr 27 2007 (Maintenance Release 1.3.1)

o   Increase query timeout period to support lengthy table scans that return
    very few records.

Jan 26 2007 (Production Release 1.3)

o   Simplify use of ODBCdL4 as a "linked server" under Microsoft SQL
    Server by treating character fields as VARCHAR or LONGVARCHAR columns.
    Previous releases treated character fields as CHAR columns.

o   Support installation on 64-bit (x64) Windows systems.

o   Support JOIN syntax required by Crystal Reports.

o   A brief description of the SQL syntax supported by ODBCdL4 has been
    added to this document (see "SQL syntax" below).

Dec 16 2005 (Production Release 1.2)

o   Support the access control feature of release 1.2 of the ODBCDl4 server.

o   Bug fixed: the odbcdL4 driver DLL was not always installed successfully.

Sep 14 2005 (Production Release 1.1)

o   First production release of ODBCdL4.

o   The ODBCdL4 server now requires an SSN authorized for release 1 of
    ODBCdL4 and for the number of expected users.

o   The IS and NOT options are now supported on RecordNum fields.

Aug 19 2005 (Beta Release 1.1.1.4)

o   Support has been added for packed data in keys and CONV format numeric
    fields in records.  For details, see the readme.txt file for the
    ODBCdL4 server.

May  6 2005 (Beta Release 1.1.1.3)

o   Support contiguous files, date conversions, record selection, and NULL
    values.  For details, see the readme.txt file for the ODBCdL4 server.

o   Due to network protocol changes, this version of ODBCdL4 for Windows
    cannot be used with older versions of the ODBCdL4 for Unix server.  All
    servers must be upgraded to version 1.1.1.5 or later of the ODBCdL4 for
    Unix server.

Feb  1 2005 (Beta Release 1.1.1.2)

o   First public release.

Jan 17 2005 (Beta Release 1.1.1.1)

o   First release.


SQL syntax supported by the ODBCdL4 server and driver
=====================================================

In the following syntax definitions, the character "|" indicates alternate
selections.  Enclosing braces ("{ x x x }") surround items that are optional.
An ellipsis ("...") indicates that the previous term can be repeated one or
more times.  Words and symbols used in the syntax are enclosed in double 
quotes (the double quotes themselves are NOT part of the syntax unless 
otherwise specified).

<supported statements> ::= <select statement>

<select statement> ::= "SELECT" <select clause> { <order by clause> }

<select clause> ::= <select cols> "FROM" <table list> { <select opts> }

<select opts> := { <where clause> } { <group by clause> } { <having clause> }

<select cols> ::= { "ALL" | "DISTINCT" } "*" |
                  { "ALL" | "DISTINCT" } <select list>
    
<select list> ::= <select list item> { "," <select list item> } ...

<select list item> ::= <expression> |
                       <expression> <alias name> |
                       <expression> "AS" <alias name> |
                       <alias name> "." "*"

<where clause> ::= "WHERE" <boolean expr>
    
<having clause> ::= "HAVING" <boolean expr>

<value list> ::= "NULL" "," <value list> |
                 <expression> "," <value list> |
                 <expression> |
                 "NULL"

<boolean expr> ::= <boolean andexpr> { "OR" <boolean expr> }

<boolean andexpr> ::= { "NOT" } <boolean value> { "AND" <boolean andexpr> }

<boolean value> ::= ( <boolean expr> ) |
            <column ref> "IS NULL" |
            <column ref> "IS NOT NULL" | 
            <expression> "LIKE" <pattern> |
            <expression> "NOT LIKE" <pattern> |
            <expression> "IN" ( <value list> ) |
            <expression> "NOT IN" "(" <value list> ")" |
            <expression> <relation> <expression> |
            "EXISTS" "(" <selection> ")" |
            <expression> <relation> { "ALL" | "ANY" } "(" <selection> ")" |
            <expression> "IN" "(" <selection> ")" |
            <expression> "NOT IN" "(" <selection> ")" |
            <expression> "BETWEEN" <expression> "AND" <expression> |
            <expression> "NOT BETWEEN" <expression> "AND" <expression>

<selection> ::= "SELECT" <select clause>

<relation> ::= ">" | ">=" | "<" | "<=" | "=" | "<>"

<pattern> ::= <string> | "?" | "USER"

<expression> ::= <expression> "+" <mul expr> |
                 <expression> "-" <mul expr> |
                 <mul expr>

<mul expr> ::= <mul expr> "*" <unary expr> |
               <mul expr> "/" <unary expr> |
               <unary expr>

<unary expr> ::= { "+" | "-" } <term>

<term> ::= ( <expression> ) |
           <column ref> |
           <simple term> |
           <aggregate term> |
           <scalar>

<scalar> ::= <scalar escape> |
             <scalar shorthand>

<scalar escape> ::= <vendor escape leadin> "FN" <fn> ")*--"

<vendor escape leadin> ::= "--*(VENDOR(MICROSOFT),PRODUCT(ODBC)"

<scalar shorthand> ::= "{" "FN" <fn> "}"

<fn> ::= <function name> "(" <value list> ")" | <function name> "(" ")" |
         "POSITION" "(" <expression> "IN" <expression> ")" |
         "EXTRACT" "(" <expression> "FROM" <expression> ")"

<aggregate term> ::= "COUNT" "(" "*" ")" |
                     "AVG" "(" <expression> ")" |
                     "MAX" "(" <expression> ")" |
                     "MIN" "(" <expression> ")" |
                     "SUM" "(" <expression> ")" |
                     "COUNT" "(" <expression> ")"

<simple term> ::= <string> |
                  <real number> |
                  "?" |
                  "USER" |
                  <date> |
                  <time> |
                  <timestamp>

<group by clause> ::= "GROUP BY" <column ref> { , <column ref> } ...

<order by clause> ::= "ORDER BY" <sort option> { , <sort option> } ...

<sort option> ::= <column ref> { "ASC" | "DESC" } |
                  <integer> { "ASC" | "DESC" }

<column ref> ::= <alias name> "." <column name> |
                 <column name>

<table list> ::= <table list item> { "," <table list item > } ...

<table list item> ::= <table ref> |
                      <outerjoin>

<outerjoin> ::= <oj> |
                <oj escape> |
                <oj shorthand>

<oj> := <table ref> "LEFT OUTER JOIN" <table ref> ON <boolean expr> | 
        <table ref> "LEFT JOIN" <table ref> ON <boolean expr> | 
        <table ref> "LEFT OUTER JOIN" <oj> "ON" <boolean expr> |
        <table ref> "LEFT JOIN" <oj> "ON" <boolean expr> |
        "(" <inneroj> ")" "INNER JOIN" <table ref> "ON" <boolean expr> |
        "(" <inneroj> ")" "INNER JOIN" <inneroj> "ON" <boolean expr> |
        <inneroj>

<oj escape> ::= <vendor escape leadin> "OJ" <oj> ")*--"

<oj shorthand> ::= "{" "OJ" <oj> "}"

<inneroj> := <table ref> "INNER JOIN" <table ref> "ON" <boolean expr> |
             <table ref> "INNER JOIN" <inneroj> "ON" <boolean expr>

<table ref> ::= <table name> |
                <table name> <alias name>

<function name> ::= "ABS" |
                    "ACOS" |
                    "ASCII" |
                    "ASIN" |
                    "ATAN" |
                    "ATAN2" |
                    "BIT_LENGTH" |
                    "CEILING" |
                    "CHAR" |
                    "CHARACTER_LENGTH" |
                    "CHAR_LENGTH" |
                    "CONCAT" |
                    "CONVERT" |
                    "COS" |
                    "COT" |
                    "CURDATE" |
                    "CURRENT_DATE" |
                    "CURRENT_TIME" |
                    "CURRENT_TIMESTAMP" |
                    "CURTIME" |
                    "DATABASE" |
                    "DAYNAME" |
                    "DAYOFMONTH" |
                    "DAYOFWEEK" |
                    "DAYOFYEAR" |
                    "DEGREES" |
                    "DIFFERENCE" |
                    "EXP" |
                    "EXTRACT" |
                    "FLOOR" |
                    "HOUR" |
                    "IFNULL" |
                    "INSERT" |
                    "LCASE" |
                    "LEFT" |
                    "LENGTH" |
                    "LOCATE" |
                    "LOG" |
                    "LOG10" |
                    "LTRIM" |
                    "MINUTE" |
                    "MOD" |
                    "MONTH" |
                    "MONTHNAME" |
                    "NOW" |
                    "OCTET_LENGTH" |
                    "PI" |
                    "POSITION" |
                    "POWER" |
                    "QUARTER" |
                    "RADIANS" |
                    "RAND" |
                    "REPEAT" |
                    "REPLACE" |
                    "RIGHT" |
                    "ROUND" |
                    "RTRIM" |
                    "SECOND" |
                    "SIGN" |
                    "SIN" |
                    "SOUNDEX" |
                    "SPACE" |
                    "SQRT" |
                    "SUBSTRING" |
                    "TAN" |
                    "TIMESTAMPADD" |
                    "TIMESTAMPDIFF" |
                    "TRUNCATE" |
                    "UCASE" |
                    "USER" |
                    "WEEK" |
                    "YEAR"

<table name> ::= <identifier>
    
<column name> ::= <identifier>

<alias name> ::= <identifier>

<date> ::= <date escape> | <date shorthand>

<date escape> ::= <vendor escape leadin> "d" <date value> ")*--"

<date shorthand> ::= "{" "d" <date value> "}"

<time> ::= <time escape> | <time shorthand>

<time escape> ::= <vendor escape leadin> "t" <time value> ")*--"

<time shorthand> ::= "{" "t" <time value> "}"

<timestamp> ::= <timestamp escape> | <timestamp shorthand>

<timestamp escape> ::= <vendor escape leadin> "ts" <timestamp value> ")*--"

<timestamp shorthand> ::= "{" "ts" <timestamp value> "}"
 
<identifier> is an identifier.  If the identifier contains spaces, then the
identifier must be enclosed in double quotes or brackets ("[ab c]").

<string> is a string enclosed in single quotes.

<real number> is a non-negative real number including E notation.

<integer> is a non-negative integer.

<date value> is a value in the form 'yyyy-mm-dd' representing a date.  The
single quotes are required.  Example: '2005-10-05'.

<time value> is a value in the form 'hh:mm:ss' representing a time of day.
The single quotes are required.  Example: '14:52:29'.

<timestamp value> is a value in the form 'yyyy-mm-dd hh:mm:ss.ffffff' or 
'yyyy-mm-dd hh:mm:ss' representing a date and time.  The single quotes are
required.  Example: '2005-10-05 14:52:29.713'.


Notes
=====

o   To use the ODBCdL4 driver for Windows, the ODBCdL4 server must be 
    installed on a server which has access to the data files.  In 
    addition, table definitions must be installed on the server for each 
    data file to be accessed.

o   The suggested TCP/IP port for use with ODBCdL4 for Windows is 9635, but
    any available port can be used.
