The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package SQL::Statement::GetInfo;

use strict;
use warnings;

use vars qw($VERSION %info);
$VERSION = '1.33';

use SQL::Statement();

my @Keywords = qw(
  INTEGERVAL STRING REALVAL IDENT NULLVAL PARAM OPERATOR IS AND OR ERROR
  INSERT UPDATE SELECT DELETE DROP CREATE ALL DISTINCT WHERE ORDER ASC
  DESC FROM INTO BY VALUES SET NOT TABLE CHAR VARCHAR REAL INTEGER
  PRIMARY KEY BLOB TEXT
  );

sub sql_keywords
{
    return join ',', @Keywords;
}

%info = (
    20 => "N"    # SQL_ACCESSIBLE_PROCEDURES
    ,
    19 => "Y"    # SQL_ACCESSIBLE_TABLES

      #     0 => undef                           # SQL_ACTIVE_CONNECTIONS
      #   116 => undef                           # SQL_ACTIVE_ENVIRONMENTS
      #     1 => undef                           # SQL_ACTIVE_STATEMENTS
    ,
    169 => 0x0000007F    # SQL_AGGREGATE_FUNCTIONS

      #                                             SQL_AF_AVG      + 1
      #                                             SQL_AF_COUNT    + 2
      #                                             SQL_AF_MAX      + 4
      #                                             SQL_AF_MIN      + 8
      #                                             SQL_AF_SUM      + 10
      #                                             SQL_AF_DISTINCT + 20
      #                                             SQL_AF_ALL      + 40
    ,
    117 => 0             # SQL_ALTER_DOMAIN -
    ,
    86 => 0              # SQL_ALTER_TABLE  -

      # 10021 => undef                           # SQL_ASYNC_MODE
      #   120 => undef                           # SQL_BATCH_ROW_COUNT
      #   121 => undef                           # SQL_BATCH_SUPPORT
      #    82 => undef                           # SQL_BOOKMARK_PERSISTENCE
    ,
    114 => 1             # SQL_CATALOG_LOCATION
    ,
    10003 => "N"         # SQL_CATALOG_NAME
    ,
    41 => '.'            # SQL_CATALOG_NAME_SEPARATOR
    ,
    42 => ""             # SQL_CATALOG_TERM
    ,
    92 => 0              # SQL_CATALOG_USAGE

      #
      # 10004 => undef                           # SQL_COLLATING_SEQUENCE
    ,
    10004 => "ISO-8859-1"    # SQL_COLLATION_SEQ
    ,
    87 => "N"                # SQL_COLUMN_ALIAS
    ,
    22 => 0                  # SQL_CONCAT_NULL_BEHAVIOR

      #
      # CONVERT FUNCTION NOT CURRENTLY SUPPORTED
      #
    ,
    53 => 0                  # SQL_CONVERT_BIGINT
    ,
    54 => 0                  # SQL_CONVERT_BINARY
    ,
    55 => 0                  # SQL_CONVERT_BIT
    ,
    56 => 0                  # SQL_CONVERT_CHAR
    ,
    57 => 0                  # SQL_CONVERT_DATE
    ,
    58 => 0                  # SQL_CONVERT_DECIMAL
    ,
    59 => 0                  # SQL_CONVERT_DOUBLE
    ,
    60 => 0                  # SQL_CONVERT_FLOAT
    ,
    48 => 0                  # SQL_CONVERT_FUNCTIONS
    ,
    173 => 0                 # SQL_CONVERT_GUID
    ,
    61 => 0                  # SQL_CONVERT_INTEGER
    ,
    123 => 0                 # SQL_CONVERT_INTERVAL_DAY_TIME
    ,
    124 => 0                 # SQL_CONVERT_INTERVAL_YEAR_MONTH
    ,
    71 => 0                  # SQL_CONVERT_LONGVARBINARY
    ,
    62 => 0                  # SQL_CONVERT_LONGVARCHAR
    ,
    63 => 0                  # SQL_CONVERT_NUMERIC
    ,
    64 => 0                  # SQL_CONVERT_REAL
    ,
    65 => 0                  # SQL_CONVERT_SMALLINT
    ,
    66 => 0                  # SQL_CONVERT_TIME
    ,
    67 => 0                  # SQL_CONVERT_TIMESTAMP
    ,
    68 => 0                  # SQL_CONVERT_TINYINT
    ,
    69 => 0                  # SQL_CONVERT_VARBINARY
    ,
    70 => 0                  # SQL_CONVERT_VARCHAR
    ,
    122 => 0                 # SQL_CONVERT_WCHAR
    ,
    125 => 0                 # SQL_CONVERT_WLONGVARCHAR
    ,
    126 => 0                 # SQL_CONVERT_WVARCHAR

      #
    ,
    74 => 2                  # SQL_CORRELATION_NAME
    ,
    127 => 0                 # SQL_CREATE_ASSERTION
    ,
    128 => 0                 # SQL_CREATE_CHARACTER_SET
    ,
    129 => 0                 # SQL_CREATE_COLLATION
    ,
    130 => 0                 # SQL_CREATE_DOMAIN
    ,
    131 => 0                 # SQL_CREATE_SCHEMA
    ,
    132 => 1                 # SQL_CREATE_TABLE
    ,
    133 => 0                 # SQL_CREATE_TRANSLATION
    ,
    134 => 0                 # SQL_CREATE_VIEW

      #
      # CURSORS NOT CURRENTLY SUPPORTED
      #
      #     23 => undef,                         # SQL_CURSOR_COMMIT_BEHAVIOR
      #     24 => undef,                         # SQL_CURSOR_ROLLBACK_BEHAVIOR
      #  10001 => undef,                         # SQL_CURSOR_SENSITIVITY
      #
      #,      2 => \&sql_data_source_name         # SQL_DATA_SOURCE_NAME
    ,
    25 => "N"                # SQL_DATA_SOURCE_READ_ONLY
    ,
    119 => 0                 # SQL_DATETIME_LITERALS

      #,     17 => \&sql_driver_name              # SQL_DBMS_NAME
      #,     18 => \&sql_driver_ver               # SQL_DBMS_VER
      #    18 => undef                           # SQL_DBMS_VERSION
      #   170 => undef,                          # SQL_DDL_INDEX
      #    26 => undef,                          # SQL_DEFAULT_TRANSACTION_ISOLATION
      #    26 => undef                           # SQL_DEFAULT_TXN_ISOLATION
    ,
    10002 => "N"             # SQL_DESCRIBE_PARAMETER

      #   171 => undef                           # SQL_DM_VER
      #     3 => undef                           # SQL_DRIVER_HDBC
      #   135 => undef                           # SQL_DRIVER_HDESC
      #     4 => undef                           # SQL_DRIVER_HENV
      #    76 => undef                           # SQL_DRIVER_HLIB
      #     5 => undef                           # SQL_DRIVER_HSTMT
      #,      6 => \&sql_driver_name              # SQL_DRIVER_NAME
      #    77 => undef                           # SQL_DRIVER_ODBC_VER
      #,      7 => \&sql_driver_ver               # SQL_DRIVER_VER
    ,
    136 => 0                 # SQL_DROP_ASSERTION
    ,
    137 => 0                 # SQL_DROP_CHARACTER_SET
    ,
    138 => 0                 # SQL_DROP_COLLATION
    ,
    139 => 0                 # SQL_DROP_DOMAIN
    ,
    140 => 0                 # SQL_DROP_SCHEMA
    ,
    141 => 1                 # SQL_DROP_TABLE
    ,
    142 => 0                 # SQL_DROP_TRANSLATION
    ,
    143 => 0                 # SQL_DROP_VIEW

      #   144 => undef                           # SQL_DYNAMIC_CURSOR_ATTRIBUTES1
      #   145 => undef                           # SQL_DYNAMIC_CURSOR_ATTRIBUTES2
      #    27 => undef                           # SQL_EXPRESSIONS_IN_ORDERBY
      #     8 => undef                           # SQL_FETCH_DIRECTION
    ,
    84 => 1                  # SQL_FILE_USAGE

      #   146 => undef                           # SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1
      #   147 => undef                           # SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2
      #    81 => undef                           # SQL_GETDATA_EXTENSIONS
      #    88 => undef                           # SQL_GROUP_BY
    ,
    28 => 4                  # SQL_IDENTIFIER_CASE
    ,
    29 => q(")               # SQL_IDENTIFIER_QUOTE_CHAR

      #   148 => undef                           # SQL_INDEX_KEYWORDS
      #   149 => undef                           # SQL_INFO_SCHEMA_VIEWS
    ,
    172 => 1                 # SQL_INSERT_STATEMENT

      #    73 => undef                           # SQL_INTEGRITY
      #   150 => undef                           # SQL_KEYSET_CURSOR_ATTRIBUTES1
      #   151 => undef                           # SQL_KEYSET_CURSOR_ATTRIBUTES2
    ,
    89 => \&sql_keywords     # SQL_KEYWORDS
    ,
    113 => "N"               # SQL_LIKE_ESCAPE_CLAUSE

      #    78 => undef                           # SQL_LOCK_TYPES
      #    34 => undef                           # SQL_MAXIMUM_CATALOG_NAME_LENGTH
      #    97 => undef                           # SQL_MAXIMUM_COLUMNS_IN_GROUP_BY
      #    98 => undef                           # SQL_MAXIMUM_COLUMNS_IN_INDEX
      #    99 => undef                           # SQL_MAXIMUM_COLUMNS_IN_ORDER_BY
      #   100 => undef                           # SQL_MAXIMUM_COLUMNS_IN_SELECT
      #   101 => undef                           # SQL_MAXIMUM_COLUMNS_IN_TABLE
      #    30 => undef                           # SQL_MAXIMUM_COLUMN_NAME_LENGTH
      #     1 => undef                           # SQL_MAXIMUM_CONCURRENT_ACTIVITIES
      #    31 => undef                           # SQL_MAXIMUM_CURSOR_NAME_LENGTH
      #     0 => undef                           # SQL_MAXIMUM_DRIVER_CONNECTIONS
      # 10005 => undef                           # SQL_MAXIMUM_IDENTIFIER_LENGTH
      #   102 => undef                           # SQL_MAXIMUM_INDEX_SIZE
      #   104 => undef                           # SQL_MAXIMUM_ROW_SIZE
      #    32 => undef                           # SQL_MAXIMUM_SCHEMA_NAME_LENGTH
      #   105 => undef                           # SQL_MAXIMUM_STATEMENT_LENGTH
      # 20000 => undef                           # SQL_MAXIMUM_STMT_OCTETS
      # 20001 => undef                           # SQL_MAXIMUM_STMT_OCTETS_DATA
      # 20002 => undef                           # SQL_MAXIMUM_STMT_OCTETS_SCHEMA
      #   106 => undef                           # SQL_MAXIMUM_TABLES_IN_SELECT
      #    35 => undef                           # SQL_MAXIMUM_TABLE_NAME_LENGTH
      #   107 => undef                           # SQL_MAXIMUM_USER_NAME_LENGTH
      # 10022 => undef                           # SQL_MAX_ASYNC_CONCURRENT_STATEMENTS
      #   112 => undef                           # SQL_MAX_BINARY_LITERAL_LEN
      #    34 => undef                           # SQL_MAX_CATALOG_NAME_LEN
      #   108 => undef                           # SQL_MAX_CHAR_LITERAL_LEN
      #    97 => undef                           # SQL_MAX_COLUMNS_IN_GROUP_BY
      #    98 => undef                           # SQL_MAX_COLUMNS_IN_INDEX
      #    99 => undef                           # SQL_MAX_COLUMNS_IN_ORDER_BY
      #   100 => undef                           # SQL_MAX_COLUMNS_IN_SELECT
      #   101 => undef                           # SQL_MAX_COLUMNS_IN_TABLE
      #    30 => undef                           # SQL_MAX_COLUMN_NAME_LEN
      #     1 => undef                           # SQL_MAX_CONCURRENT_ACTIVITIES
      #    31 => undef                           # SQL_MAX_CURSOR_NAME_LEN
      #     0 => undef                           # SQL_MAX_DRIVER_CONNECTIONS
      # 10005 => undef                           # SQL_MAX_IDENTIFIER_LEN
      #   102 => undef                           # SQL_MAX_INDEX_SIZE
      #    32 => undef                           # SQL_MAX_OWNER_NAME_LEN
      #    33 => undef                           # SQL_MAX_PROCEDURE_NAME_LEN
      #    34 => undef                           # SQL_MAX_QUALIFIER_NAME_LEN
      #   104 => undef                           # SQL_MAX_ROW_SIZE
      #   103 => undef                           # SQL_MAX_ROW_SIZE_INCLUDES_LONG
      #    32 => undef                           # SQL_MAX_SCHEMA_NAME_LEN
      #   105 => undef                           # SQL_MAX_STATEMENT_LEN
      #   106 => undef                           # SQL_MAX_TABLES_IN_SELECT
      #    35 => undef                           # SQL_MAX_TABLE_NAME_LEN
      #   107 => undef                           # SQL_MAX_USER_NAME_LEN
      #    37 => undef                           # SQL_MULTIPLE_ACTIVE_TXN
      #    36 => undef                           # SQL_MULT_RESULT_SETS
    ,
    111 => "N"    # SQL_NEED_LONG_DATA_LEN
    ,
    75 => 1       # SQL_NON_NULLABLE_COLUMNS
    ,
    85 => 1       # SQL_NULL_COLLATION
    ,
    49 => 0       # SQL_NUMERIC_FUNCTIONS

      #     9 => undef                           # SQL_ODBC_API_CONFORMANCE
      #   152 => undef                           # SQL_ODBC_INTERFACE_CONFORMANCE
      #    12 => undef                           # SQL_ODBC_SAG_CLI_CONFORMANCE
      #    15 => undef                           # SQL_ODBC_SQL_CONFORMANCE
      #    73 => undef                           # SQL_ODBC_SQL_OPT_IEF
      #    10 => undef                           # SQL_ODBC_VER
    ,
    115 => 0x00000037    # SQL_OJ_CAPABILITIES

      #           1   SQL_OJ_LEFT                +  left joins SUPPORTED
      #           2   SQL_OJ_RIGHT               +  right joins SUPPORTED
      #           4   SQL_OJ_FULL                +  full joins SUPPORTED
      #               SQL_OJ_NESTED              -  nested joins not supported
      #          10   SQL_OJ_NOT_ORDERED         +  on clause col order not required
      #          20   SQL_OJ_INNER               +  inner joins SUPPORTED
      #               SQL_OJ_ALL_COMPARISON_OPS  -  on clause comp op must be =
    ,
    90 => "N"            # SQL_ORDER_BY_COLUMNS_IN_SELECT

      #    38 => undef                           # SQL_OUTER_JOINS
      #   115 => undef                           # SQL_OUTER_JOIN_CAPABILITIES
      #    39 => undef                           # SQL_OWNER_TERM
      #    91 => undef                           # SQL_OWNER_USAGE
      #   153 => undef                           # SQL_PARAM_ARRAY_ROW_COUNTS
      #   154 => undef                           # SQL_PARAM_ARRAY_SELECTS
      #    80 => undef                           # SQL_POSITIONED_STATEMENTS
      #    79 => undef                           # SQL_POS_OPERATIONS
    ,
    21 => "N"            # SQL_PROCEDURES

      #    40 => undef                           # SQL_PROCEDURE_TERM
      #   114 => undef                           # SQL_QUALIFIER_LOCATION
      #    41 => undef                           # SQL_QUALIFIER_NAME_SEPARATOR
      #    42 => undef                           # SQL_QUALIFIER_TERM
      #    92 => undef                           # SQL_QUALIFIER_USAGE
    ,
    93 => 3              # SQL_QUOTED_IDENTIFIER_CASE
    ,
    11 => "N"            # SQL_ROW_UPDATES
    ,
    39 => "schema"       # SQL_SCHEMA_TERM

      #    91 => undef                           # SQL_SCHEMA_USAGE
      #    43 => undef                           # SQL_SCROLL_CONCURRENCY
      #    44 => undef                           # SQL_SCROLL_OPTIONS
      #    14 => undef                           # SQL_SEARCH_PATTERN_ESCAPE
      #    13 => undef                           # SQL_SERVER_NAME
      #    94 => undef                           # SQL_SPECIAL_CHARACTERS
      #   155 => undef                           # SQL_SQL92_DATETIME_FUNCTIONS
      #   156 => undef                           # SQL_SQL92_FOREIGN_KEY_DELETE_RULE
      #   157 => undef                           # SQL_SQL92_FOREIGN_KEY_UPDATE_RULE
      #   158 => undef                           # SQL_SQL92_GRANT
      #   159 => undef                           # SQL_SQL92_NUMERIC_VALUE_FUNCTIONS
    ,
    160 => 0x00003E06    # SQL_SQL92_PREDICATES

      #                               SQL_SP_EXISTS                    -      -
      #                               SQL_SP_ISNOTNULL                 +      +   2
      #                               SQL_SP_ISNULL                    +      +   4
      #                               SQL_SP_MATCH_FULL                -      -
      #                               SQL_SP_MATCH_PARTIAL             -      -
      #                               SQL_SP_MATCH_UNIQUE_FULL         -      -
      #                               SQL_SP_MATCH_UNIQUE_PARTIAL      -      -
      #                               SQL_SP_OVERLAPS                  -      -
      #                               SQL_SP_UNIQUE                    -      -
      #                               SQL_SP_LIKE                      +      +  200
      #                               SQL_SP_IN                        -      +  400
      #                               SQL_SP_BETWEEN                   -      +  800
      #                               SQL_SP_COMPARISON                +      + 1000
      #                               SQL_SP_QUANTIFIED_COMPARISON     +      + 2000
    ,
    161 => 0x000001D8    # SQL_SQL92_RELATIONAL_JOIN_OPERATORS

      #         SQL_SRJO_CORRESPONDING_CLAUSE  -   corresponding clause not supported
      #         SQL_SRJO_CROSS_JOIN            -   cross join not supported
      #         SQL_SRJO_EXCEPT_JOIN           -   except join not supported
      #     8   SQL_SRJO_FULL_OUTER_JOIN       +   full join SUPPORTED
      #    10   SQL_SRJO_INNER_JOIN            +   inner join SUPPORTED
      #         SQL_SRJO_INTERSECT_JOIN        -   intersect join not supported
      #    40   SQL_SRJO_LEFT_OUTER_JOIN       +   left join SUPPORTED
      #    80   SQL_SRJO_NATURAL_JOIN          +   natural join SUPPORTED
      #   100   SQL_SRJO_RIGHT_OUTER_JOIN      +   right join SUPPORTED
      #         SQL_SRJO_UNION_JOIN            -   union join not supported
      #   162 => undef                           # SQL_SQL92_REVOKE
    ,
    163 => 3    # SQL_SQL92_ROW_VALUE_CONSTRUCTOR

      #                                                    SQL_SRVC_VALUE_EXPRESSION
      #                                                    SQL_SRVC_NULL
      #                                                    SQL_SRVC_DEFAULT
      #                                                    SQL_SRVC_ROW_SUBQUERY
    ,
    164 => 0x000000EE    # SQL_SQL92_STRING_FUNCTIONS

      #  SQL_SSF_CONVERT         -    /* convert() string function not supported */
      #  SQL_SSF_LOWER        2  +    /* lower() string function SUPPORTED */
      #  SQL_SSF_UPPER        4  +    /* upper() string function SUPPORTED */
      #  SQL_SSF_SUBSTRING    8  +    /* substring() string function SUPPORTED */
      #  SQL_SSF_TRANSLATE       -    /* translate() string function not supported */
      #  SQL_SSF_TRIM_BOTH   32  +    /* trim() both string function SUPPORTED */
      #  SQL_SSF_TRIM_LEADING 64 +    /* trim() leading string function SUPPORTED */
      #  SQL_SSF_TRIM_TRAILING128+    /* trim() trailing string function SUPPORTED */
      #   165 => undef                           # SQL_SQL92_VALUE_EXPRESSIONS
      #   118 => undef                           # SQL_SQL_CONFORMANCE
      #   166 => undef                           # SQL_STANDARD_CLI_CONFORMANCE
      #   167 => undef                           # SQL_STATIC_CURSOR_ATTRIBUTES1
      #   168 => undef                           # SQL_STATIC_CURSOR_ATTRIBUTES2
      #    83 => undef                           # SQL_STATIC_SENSITIVITY
    ,
    50 => 0x00001C49    # SQL_STRING_FUNCTIONS

      #      SQL_FN_STR_CONCAT                         => 0x00000001 +
      #      SQL_FN_STR_INSERT                         => 0x00000002
      #      SQL_FN_STR_LEFT                           => 0x00000004
      #      SQL_FN_STR_LTRIM                          => 0x00000008 +
      #      SQL_FN_STR_LENGTH                         => 0x00000010
      #      SQL_FN_STR_LOCATE                         => 0x00000020
      #      SQL_FN_STR_LCASE                          => 0x00000040 +
      #      SQL_FN_STR_REPEAT                         => 0x00000080
      #      SQL_FN_STR_REPLACE                        => 0x00000100
      #      SQL_FN_STR_RIGHT                          => 0x00000200
      #      SQL_FN_STR_RTRIM                          => 0x00000400 +
      #      SQL_FN_STR_SUBSTRING                      => 0x00000800 +
      #      SQL_FN_STR_UCASE                          => 0x00001000 +
      #      SQL_FN_STR_ASCII                          => 0x00002000
      #      SQL_FN_STR_CHAR                           => 0x00004000
      #      SQL_FN_STR_DIFFERENCE                     => 0x00008000
      #      SQL_FN_STR_LOCATE_2                       => 0x00010000
      #      SQL_FN_STR_SOUNDEX                        => 0x00020000
      #      SQL_FN_STR_SPACE                          => 0x00040000
      #      SQL_FN_STR_BIT_LENGTH                     => 0x00080000
      #      SQL_FN_STR_CHAR_LENGTH                    => 0x00100000
      #      SQL_FN_STR_CHARACTER_LENGTH               => 0x00200000
      #      SQL_FN_STR_OCTET_LENGTH                   => 0x00400000
      #      SQL_FN_STR_POSITION                       => 0x00800000
      #    95 => undef                           # SQL_SUBQUERIES
      #    51 => undef                           # SQL_SYSTEM_FUNCTIONS
    ,
    45 => "table"    # SQL_TABLE_TERM

      #   109 => undef                           # SQL_TIMEDATE_ADD_INTERVALS
      #   110 => undef                           # SQL_TIMEDATE_DIFF_INTERVALS
      #    52 => undef                           # SQL_TIMEDATE_FUNCTIONS
      #    46 => undef                           # SQL_TRANSACTION_CAPABLE
      #    72 => undef                           # SQL_TRANSACTION_ISOLATION_OPTION
      #    46 => undef                           # SQL_TXN_CAPABLE
      #    72 => undef                           # SQL_TXN_ISOLATION_OPTION
      #    96 => undef                           # SQL_UNION
      #    96 => undef                           # SQL_UNION_STATEMENT
      #,    47 => \&sql_user_name                 # SQL_USER_NAME
      # 10000 => undef                           # SQL_XOPEN_CLI_YEAR
);

1;

__END__

NO LONGER NEEDED

sub sql_driver_name {
    shift->{"Driver"}->{"Name"};
}

sub sql_driver_ver {
    my $dbh = shift;
    my $ver = shift;
    my $drv = 'DBD::'.$dbh->{"Driver"}->{"Name"};
#    $ver = "$drv"."::VERSION";
#    $ver = ${$ver};
    my $fmt = '%02d.%02d.%1d%1d%1d%1d';   # ODBC version string: ##.##.#####
    $ver = sprintf $fmt, split (/\./, $ver);
    return $ver . '; ss-'. $SQL::Statement::VERSION;
}

sub sql_data_source_name {
    my $dbh = shift;
    return 'dbi:'.$dbh->{"Driver"}->{"Name"}.':'.$dbh->{"Name"};
}
sub sql_user_name {
    my $dbh = shift;
    return $dbh->{"CURRENT_USER"};
}

=pod

=head1 NAME

SQL::Statement::GetInfo

=head1 SYNOPSIS

  # see L<DBI>

=head1 DESCRIPTION

This package contains support for C<$dbh->get_info()>.

=head1 INHERITANCE

  SQL::Statement::GetInfo

=begin undocumented

=head1 METHODS

=head2 sql_keywords

Returns the list of keywords

=end undocumented

=cut