summaryrefslogtreecommitdiff
path: root/storage/ndb/src/old_files/client/odbc/docs
diff options
context:
space:
mode:
Diffstat (limited to 'storage/ndb/src/old_files/client/odbc/docs')
-rw-r--r--storage/ndb/src/old_files/client/odbc/docs/class.fig332
-rw-r--r--storage/ndb/src/old_files/client/odbc/docs/descfield.pl1482
-rw-r--r--storage/ndb/src/old_files/client/odbc/docs/diag.txt48
-rw-r--r--storage/ndb/src/old_files/client/odbc/docs/getinfo.pl3676
-rw-r--r--storage/ndb/src/old_files/client/odbc/docs/gettypeinfo.pl645
-rw-r--r--storage/ndb/src/old_files/client/odbc/docs/handleattr.pl2232
-rw-r--r--storage/ndb/src/old_files/client/odbc/docs/main.hpp104
-rw-r--r--storage/ndb/src/old_files/client/odbc/docs/ndbodbc.html659
-rw-r--r--storage/ndb/src/old_files/client/odbc/docs/select.fig94
-rw-r--r--storage/ndb/src/old_files/client/odbc/docs/systables.pl2192
-rw-r--r--storage/ndb/src/old_files/client/odbc/docs/type.txt333
11 files changed, 11797 insertions, 0 deletions
diff --git a/storage/ndb/src/old_files/client/odbc/docs/class.fig b/storage/ndb/src/old_files/client/odbc/docs/class.fig
new file mode 100644
index 00000000000..38c24c1fba4
--- /dev/null
+++ b/storage/ndb/src/old_files/client/odbc/docs/class.fig
@@ -0,0 +1,332 @@
+#FIG 3.2
+Landscape
+Flush left
+Inches
+A4
+100.00
+Single
+-2
+1200 2
+6 600 6600 1500 9600
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 600 6600 1500 6600 1500 7200 600 7200 600 6600
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 600 7800 1500 7800 1500 8400 600 8400 600 7800
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 600 9000 1500 9000 1500 9600 600 9600 600 9000
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 900 9000 900 8400
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 900 7800 900 7200
+4 0 0 50 0 12 12 0.0000 4 180 420 750 6825 Diag\001
+4 0 0 50 0 12 12 0.0000 4 180 420 750 8025 Diag\001
+4 0 0 50 0 12 12 0.0000 4 135 630 750 8325 Record\001
+4 0 0 50 0 12 12 0.0000 4 180 420 750 9225 Diag\001
+4 0 0 50 0 12 12 0.0000 4 135 525 750 9525 Field\001
+4 0 0 50 0 12 12 0.0000 4 120 420 750 7125 Area\001
+-6
+6 2700 6600 3600 9600
+6 2700 6600 3600 9600
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2700 6600 3600 6600 3600 7200 2700 7200 2700 6600
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 2700 9000 3600 9000 3600 9600 2700 9600 2700 9000
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 3000 9000 3000 7200
+4 0 0 50 0 12 12 0.0000 4 120 420 2850 6825 Attr\001
+4 0 0 50 0 12 12 0.0000 4 120 420 2850 9225 Attr\001
+4 0 0 50 0 12 12 0.0000 4 135 525 2850 9525 Field\001
+4 0 0 50 0 12 12 0.0000 4 120 420 2850 7125 Area\001
+-6
+-6
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3300 3900 4200 3900 4200 4500 3300 4500 3300 3900
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3300 2700 4200 2700 4200 3300 3300 3300 3300 2700
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3300 1500 4200 1500 4200 2100 3300 2100 3300 1500
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 3300 300 4200 300 4200 900 3300 900 3300 300
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 1800 2700 2700 2700 2700 3300 1800 3300 1800 2700
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 1 2
+ 1 1 1.00 60.00 120.00
+ 3300 1800 3000 1800
+2 1 0 1 0 7 50 0 -1 0.000 0 0 7 0 1 2
+ 1 1 1.00 60.00 120.00
+ 3300 3000 3000 3000
+2 1 0 1 0 7 50 0 -1 0.000 0 0 7 0 1 2
+ 1 1 1.00 60.00 120.00
+ 3300 4200 3000 4200
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 1 2
+ 1 1 1.00 60.00 120.00
+ 1 1 1.00 60.00 120.00
+ 4200 4200 4800 4200
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 3600 3900 3600 3300
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 3600 2700 3600 2100
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 3600 1500 3600 900
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4800 5100 5700 5100 5700 5700 4800 5700 4800 5100
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4800 2700 5700 2700 5700 3300 4800 3300 4800 2700
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4800 3900 5700 3900 5700 4500 4800 4500 4800 3900
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 1 2
+ 1 1 1.00 60.00 120.00
+ 1 1 1.00 60.00 120.00
+ 5100 6600 5100 5700
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 6
+ 1 1 1.00 60.00 120.00
+ 5100 5100 5100 4800 4500 4800 4500 3600 3900 3600 3900 3300
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 3
+ 1 1 1.00 60.00 120.00
+ 3600 4500 3600 5400 4800 5400
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4800 6600 5700 6600 5700 7200 4800 7200 4800 6600
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4800 7800 5700 7800 5700 8400 4800 8400 4800 7800
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 4800 9000 5700 9000 5700 9600 4800 9600 4800 9000
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 5100 9000 5100 8400
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
+ 1 1 1.00 60.00 120.00
+ 5100 7800 5100 7200
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 1 2
+ 1 1 1.00 60.00 120.00
+ 1 1 1.00 60.00 120.00
+ 4200 3000 4800 3000
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6900 2700 7800 2700 7800 3300 6900 3300 6900 2700
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 6900 1500 7800 1500 7800 2100 6900 2100 6900 1500
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 3
+ 0 0 1.00 60.00 120.00
+ 7200 3300 7200 4050 5700 4050
+2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 3
+ 0 0 1.00 60.00 120.00
+ 11700 3300 11700 4350 5700 4350
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5100 3900 5100 3300
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 8400 300 9300 300 9300 900 8400 900 8400 300
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 5100 2700 5100 900
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 0 0 2
+ 3000 6600 3000 1800
+2 2 0 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+ 6900 5100 7800 5100 7800 6000 6900 6000 6900 5100
+2 2 0 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+ 8400 5100 9300 5100 9300 6000 8400 6000 8400 5100
+2 2 0 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+ 9900 5100 10800 5100 10800 6000 9900 6000 9900 5100
+2 2 0 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+ 11400 5100 12300 5100 12300 6000 11400 6000 11400 5100
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 7800 5550 8400 5550
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 9300 5550 9900 5550
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 7500 5100 7500 3300
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 10500 5100 10500 3300
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 12000 5100 12000 3300
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 9900 2700 10800 2700 10800 3300 9900 3300 9900 2700
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 11400 2700 12300 2700 12300 3300 11400 3300 11400 2700
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 11400 1500 12300 1500 12300 2100 11400 2100 11400 1500
+2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
+ 9900 1500 10800 1500 10800 2100 9900 2100 9900 1500
+2 2 0 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+ 6900 6600 7800 6600 7800 7200 6900 7200 6900 6600
+2 2 0 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+ 6900 7800 7800 7800 7800 8400 6900 8400 6900 7800
+2 2 0 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+ 8400 6600 9300 6600 9300 7200 8400 7200 8400 6600
+2 2 0 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+ 8400 7800 9300 7800 9300 8400 8400 8400 8400 7800
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 5700 3000 6300 3000 6300 6900 6900 6900
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 4
+ 0 0 1.00 60.00 120.00
+ 5700 4200 6000 4200 6000 8100 6900 8100
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 8400 6900 7800 6900
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 8400 8100 7800 8100
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 9900 6900 9300 6900
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 9900 8100 9300 8100
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 11400 6900 10800 6900
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 11400 8100 10800 8100
+2 2 0 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+ 11400 6600 12300 6600 12300 7200 11400 7200 11400 6600
+2 2 0 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+ 11400 7800 12300 7800 12300 8400 11400 8400 11400 7800
+2 2 0 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+ 9900 6600 10800 6600 10800 7200 9900 7200 9900 6600
+2 2 0 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+ 9900 7800 10800 7800 10800 8400 9900 8400 9900 7800
+2 2 0 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+ 8400 2700 9300 2700 9300 3300 8400 3300 8400 2700
+2 2 0 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+ 8400 1500 9300 1500 9300 2100 8400 2100 8400 1500
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 9000 5100 9000 3300
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 7800 3000 8400 3000
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 9300 3000 9900 3000
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 7800 1800 8400 1800
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 9300 1800 9900 1800
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 11400 3000 10800 3000
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 11400 1800 10800 1800
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 11400 5550 10800 5550
+2 4 0 2 0 7 50 0 -1 6.000 0 0 7 0 0 5
+ 5700 900 5700 300 4800 300 4800 900 5700 900
+2 2 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+ 12900 6600 13800 6600 13800 7200 12900 7200 12900 6600
+2 2 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+ 12900 5100 13800 5100 13800 5700 12900 5700 12900 5100
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 13200 7800 13200 7200
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 13200 6600 13200 5700
+2 2 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
+ 12900 7800 13800 7800 13800 8400 12900 8400 12900 7800
+2 1 1 1 0 7 50 0 -1 4.000 0 0 -1 1 0 3
+ 0 0 1.00 60.00 120.00
+ 13200 5100 13200 1800 12300 1800
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 1 4
+ 0 0 1.00 60.00 120.00
+ 0 0 1.00 60.00 120.00
+ 5700 7050 6600 7050 6600 7875 6900 7875
+4 0 0 50 0 12 12 0.0000 4 135 630 3375 525 Handle\001
+4 0 0 50 0 12 12 0.0000 4 135 630 3375 1725 Handle\001
+4 0 0 50 0 12 12 0.0000 4 135 630 3375 2925 Handle\001
+4 0 0 50 0 12 12 0.0000 4 135 630 3375 4125 Handle\001
+4 0 0 50 0 12 12 0.0000 4 120 420 3450 825 Root\001
+4 0 0 50 0 12 12 0.0000 4 120 315 3450 2025 Env\001
+4 0 0 50 0 12 12 0.0000 4 135 315 3450 3225 Dbc\001
+4 0 0 50 0 12 12 0.0000 4 120 420 3450 4425 Stmt\001
+4 0 0 50 0 12 12 0.0000 4 135 630 1875 2925 Handle\001
+4 0 0 50 0 12 12 0.0000 4 120 420 1950 3225 Base\001
+4 0 0 50 0 12 12 0.0000 4 135 630 4875 5325 Handle\001
+4 0 0 50 0 12 12 0.0000 4 120 420 4950 5625 Desc\001
+4 0 0 50 0 12 12 0.0000 4 120 420 4875 3225 Area\001
+4 0 0 50 0 12 12 0.0000 4 120 420 4875 2925 Conn\001
+4 0 0 50 0 12 12 0.0000 4 120 420 4875 4425 Area\001
+4 0 0 50 0 12 12 0.0000 4 120 420 4875 4125 Stmt\001
+4 0 0 50 0 12 12 0.0000 4 120 420 4950 6825 Desc\001
+4 0 0 50 0 12 12 0.0000 4 120 420 4950 8025 Desc\001
+4 0 0 50 0 12 12 0.0000 4 135 630 4950 8325 Record\001
+4 0 0 50 0 12 12 0.0000 4 120 420 4950 9225 Desc\001
+4 0 0 50 0 12 12 0.0000 4 120 420 4950 7125 Area\001
+4 0 0 50 0 12 12 0.0000 4 135 525 4950 9525 Field\001
+4 0 0 50 0 12 12 0.0000 4 135 735 3675 5925 ird ard\001
+4 0 0 50 0 12 12 0.0000 4 180 735 3675 5625 ipd apd\001
+4 0 0 50 0 12 12 0.0000 4 135 420 6975 2925 Plan\001
+4 0 0 50 0 12 12 0.0000 4 120 420 6975 3225 root\001
+4 0 0 50 0 12 12 0.0000 4 135 420 6975 1725 Plan\001
+4 0 0 50 0 12 12 0.0000 4 120 420 6975 2025 Tree\001
+4 0 0 50 0 12 12 0.0000 4 120 420 8475 525 Base\001
+4 0 0 50 0 12 12 0.0000 4 120 420 8475 825 Tree\001
+4 0 0 50 0 12 12 0.0000 4 120 315 5025 675 NDB\001
+4 0 0 50 0 14 14 0.0000 4 195 1755 300 525 Class Diagram\001
+4 0 0 50 0 12 12 0.0000 4 135 420 6975 5325 Plan\001
+4 0 0 50 0 12 12 0.0000 4 135 630 6975 5625 delete\001
+4 0 0 50 0 12 12 0.0000 4 135 840 6975 5925 searched\001
+4 0 0 50 0 12 12 0.0000 4 135 420 8475 5325 Plan\001
+4 0 0 50 0 12 12 0.0000 4 135 630 8475 5625 delete\001
+4 0 0 50 0 12 12 0.0000 4 135 420 8475 5925 full\001
+4 0 0 50 0 12 12 0.0000 4 135 420 9975 5325 Code\001
+4 0 0 50 0 12 12 0.0000 4 135 630 9975 5625 delete\001
+4 0 0 50 0 12 12 0.0000 4 135 420 9975 5925 full\001
+4 0 0 50 0 12 12 0.0000 4 120 315 11475 5325 Run\001
+4 0 0 50 0 12 12 0.0000 4 135 630 11475 5625 delete\001
+4 0 0 50 0 12 12 0.0000 4 135 420 11475 5925 full\001
+4 0 0 50 0 12 12 0.0000 4 120 420 9975 3225 root\001
+4 0 0 50 0 12 12 0.0000 4 120 315 11475 2925 Run\001
+4 0 0 50 0 12 12 0.0000 4 120 420 11475 3225 root\001
+4 0 0 50 0 12 12 0.0000 4 120 315 11475 1725 Run\001
+4 0 0 50 0 12 12 0.0000 4 120 420 11475 2025 Tree\001
+4 0 0 50 0 12 12 0.0000 4 135 420 9975 1725 Code\001
+4 0 0 50 0 12 12 0.0000 4 120 420 9975 2025 Tree\001
+4 0 0 50 0 12 12 0.0000 4 135 420 9975 2925 Code\001
+4 0 0 50 0 12 12 0.0000 4 120 420 6975 6825 Conn\001
+4 0 0 50 0 12 12 0.0000 4 180 735 6975 7125 Catalog\001
+4 0 0 50 0 12 12 0.0000 4 120 420 6975 8025 Stmt\001
+4 0 0 50 0 12 12 0.0000 4 180 735 6975 8325 Catalog\001
+4 0 0 50 0 12 12 0.0000 4 120 420 8475 6825 Conn\001
+4 0 0 50 0 12 12 0.0000 4 120 420 8475 8025 Stmt\001
+4 0 0 50 0 12 12 0.0000 4 135 630 8475 7125 Schema\001
+4 0 0 50 0 12 12 0.0000 4 135 630 8475 8325 Schema\001
+4 0 0 50 0 12 12 0.0000 4 120 420 11475 6825 Conn\001
+4 0 0 50 0 12 12 0.0000 4 120 420 11475 8025 Stmt\001
+4 0 0 50 0 12 12 0.0000 4 135 630 11475 7125 Column\001
+4 0 0 50 0 12 12 0.0000 4 135 525 11475 8325 Field\001
+4 0 0 50 0 12 12 0.0000 4 120 420 9975 6825 Conn\001
+4 0 0 50 0 12 12 0.0000 4 120 420 9975 8025 Stmt\001
+4 0 0 50 0 12 12 0.0000 4 135 525 9975 7125 Table\001
+4 0 0 50 0 12 12 0.0000 4 120 315 9975 8325 Row\001
+4 0 0 50 0 12 12 0.0000 4 135 420 8475 1725 Plan\001
+4 0 0 50 0 12 12 0.0000 4 120 420 8475 2025 Tree\001
+4 0 0 50 0 12 12 0.0000 4 135 420 8475 2925 Plan\001
+4 0 0 50 0 12 12 0.0000 4 120 420 8475 3225 root\001
+4 0 0 50 0 14 11 0.0000 4 180 840 675 825 (prelim)\001
+4 0 0 50 0 12 12 0.0000 4 180 525 6375 1350 input\001
+4 0 0 50 0 12 12 0.0000 4 180 840 7725 1350 optimize\001
+4 0 0 50 0 12 12 0.0000 4 165 630 9375 1350 output\001
+4 0 0 50 0 12 12 0.0000 4 120 735 10650 1350 execute\001
+4 0 0 50 0 12 12 0.0000 4 135 525 12075 1350 fetch\001
+4 0 0 50 0 12 12 0.0000 4 135 630 13050 5325 Result\001
+4 0 0 50 0 12 12 0.0000 4 120 315 13050 5625 Set\001
+4 0 0 50 0 12 12 0.0000 4 135 630 13050 6825 Result\001
+4 0 0 50 0 12 12 0.0000 4 120 315 13125 7125 Row\001
+4 0 0 50 0 12 12 0.0000 4 135 630 13050 8025 Result\001
+4 0 0 50 0 12 12 0.0000 4 135 525 13050 8325 Field\001
diff --git a/storage/ndb/src/old_files/client/odbc/docs/descfield.pl b/storage/ndb/src/old_files/client/odbc/docs/descfield.pl
new file mode 100644
index 00000000000..80fef22f303
--- /dev/null
+++ b/storage/ndb/src/old_files/client/odbc/docs/descfield.pl
@@ -0,0 +1,1482 @@
+# usage perl Desc.data
+# prints template for DescSpec.cpp
+use strict;
+my $order = 0;
+
+# XXX do it later
+
+#
+# odbcsqlsetdescfield.htm
+#
+my $descSpec = {
+# <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+# <HTML DIR="LTR"><HEAD>
+# <META HTTP-EQUIV="Content-Type" Content="text/html; charset=Windows-1252">
+# <TITLE>SQLSetDescField</TITLE>
+# <SCRIPT SRC="/stylesheets/vs70link.js"></SCRIPT>
+# <SCRIPT SRC="/stylesheets/vs70.js"></SCRIPT>
+# <SCRIPT LANGUAGE="JScript" SRC="/stylesheets/odbc.js"></SCRIPT>
+# </HEAD>
+# <body topmargin=0 id="bodyID">
+#
+# <div id="nsbanner">
+# <div id="bannertitle">
+# <TABLE CLASS="bannerparthead" CELLSPACING=0>
+# <TR ID="hdr">
+# <TD CLASS="bannertitle" nowrap>
+# ODBC Programmer's Reference
+# </TD><TD valign=middle><a href="#Feedback"><IMG name="feedb" onclick=EMailStream(SDKFeedB) style="CURSOR: hand;" hspace=15 alt="" src="/stylesheets/mailto.gif" align=right></a></TD>
+# </TR>
+# </TABLE>
+# </div>
+# </div>
+# <DIV id="nstext" valign="bottom">
+#
+# <H1><A NAME="odbcsqlsetdescfield"></A>SQLSetDescField</H1>
+#
+# <P class="label"><B>Conformance</B></P>
+#
+# <P>Version Introduced: ODBC 3.0<BR>
+# Standards Compliance: ISO 92</P>
+#
+# <P class="label"><B>Summary</B></P>
+#
+# <P><B>SQLSetDescField</B> sets the value of a single field of a descriptor record.</P>
+#
+# <P class="label"><B>Syntax</B></P>
+#
+# <PRE class="syntax">SQLRETURN <B>SQLSetDescField</B>(
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLHDESC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>DescriptorHandle</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLSMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>RecNumber</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLSMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>FieldIdentifier</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLPOINTER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>ValuePtr</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLINTEGER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>BufferLength</I>);</PRE>
+#
+# <P class="label"><B>Arguments</B>
+#
+# <DL>
+# <DT><I>DescriptorHandle</I></DT>
+#
+# <DD>[Input]<BR>
+# Descriptor handle.</dd>
+#
+# <DT><I>RecNumber</I></DT>
+#
+# <DD>[Input]<BR>
+# Indicates the descriptor record containing the field that the application seeks to set. Descriptor records are numbered from 0, with record number 0 being the bookmark record. The <I>RecNumber</I> argument is ignored for header fields.</dd>
+#
+# <DT><I>FieldIdentifier</I></DT>
+#
+# <DD>[Input]<BR>
+# Indicates the field of the descriptor whose value is to be set. For more information, see "<I>FieldIdentifier</I> Argument" in the "Comments" section.</dd>
+#
+# <DT><I>ValuePtr</I></DT>
+#
+# <DD>[Input]<BR>
+# Pointer to a buffer containing the descriptor information, or a 4-byte value. The data type depends on the value of <I>FieldIdentifier</I>. If <I>ValuePtr</I> is a 4-byte value, either all four of the bytes are used or just two of the four are used, depending on the value of the <I>FieldIdentifier</I> argument.</dd>
+#
+# <DT><I>BufferLength</I></DT>
+#
+# <DD>[Input]<BR>
+# If <I>FieldIdentifier</I> is an ODBC-defined field and <I>ValuePtr</I> points to a character string or a binary buffer, this argument should be the length of *<I>ValuePtr</I>. If <I>FieldIdentifier</I> is an ODBC-defined field and <I>ValuePtr</I> is an integer, <I>BufferLength</I> is ignored.
+#
+# <P>If <I>FieldIdentifier</I> is a driver-defined field, the application indicates the nature of the field to the Driver Manager by setting the <I>BufferLength</I> argument. <I>BufferLength</I> can have the following values:
+#
+#
+# <UL type=disc>
+# <LI>If <I>ValuePtr</I> is a pointer to a character string, then <I>BufferLength</I> is the length of the string or SQL_NTS.</li>
+#
+# <LI>If <I>ValuePtr</I> is a pointer to a binary buffer, then the application places the result of the SQL_LEN_BINARY_ATTR(<I>length</I>) macro in <I>BufferLength</I>. This places a negative value in <I>BufferLength</I>.</li>
+#
+# <LI>If <I>ValuePtr</I> is a pointer to a value other than a character string or a binary string, then <I>BufferLength</I> should have the value SQL_IS_POINTER. </li>
+#
+# <LI>If <I>ValuePtr</I> contains a fixed-length value, then <I>BufferLength</I> is either SQL_IS_INTEGER, SQL_IS_UINTEGER, SQL_IS_SMALLINT, or SQL_IS_USMALLINT, as appropriate.</li>
+# </UL>
+# </dd>
+# </DL>
+#
+# <P class="label"><B>Returns</B></P>
+#
+# <P>SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or SQL_INVALID_HANDLE.</P>
+#
+# <P class="label"><B>Diagnostics</B></P>
+#
+# <P>When <B>SQLSetDescField</B> returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value can be obtained by calling <B>SQLGetDiagRec</B> with a <I>HandleType</I> of SQL_HANDLE_DESC and a <I>Handle</I> of <I>DescriptorHandle</I>. The following table lists the SQLSTATE values commonly returned by <B>SQLSetDescField</B> and explains each one in the context of this function; the notation "(DM)" precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=16%>SQLSTATE</TH>
+# <TH width=30%>Error</TH>
+# <TH width=54%>Description</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=16%>01000</TD>
+# <TD width=30%>General warning</TD>
+# <TD width=54%>Driver-specific informational message. (Function returns SQL_SUCCESS_WITH_INFO.)</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=16%>01S02</TD>
+# <TD width=30%>Option value changed</TD>
+# <TD width=54%>The driver did not support the value specified in <I>*ValuePtr</I> (if <I>ValuePtr</I> was a pointer) or the value in <I>ValuePtr</I> (if <I>ValuePtr </I>was a 4-byte value), or <I>*ValuePtr</I> was invalid because of implementation working conditions, so the driver substituted a similar value. (Function returns SQL_SUCCESS_WITH_INFO.)</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=16%>07009</TD>
+# <TD width=30%>Invalid descriptor index</TD>
+# <TD width=54%>The <I>FieldIdentifier</I> argument was a record field, the <I>RecNumber</I> argument was 0, and the <I>DescriptorHandle</I> argument referred to an IPD handle.
+# <P>The <I>RecNumber</I> argument was less than 0, and the <I>DescriptorHandle</I> argument referred to an ARD or an APD.</P>
+#
+# <P>The <I>RecNumber</I> argument was greater than the maximum number of columns or parameters that the data source can support, and the <I>DescriptorHandle</I> argument referred to an APD or ARD.</P>
+#
+# <P>(DM) The <I>FieldIdentifier</I> argument was SQL_DESC_COUNT, and <I>*ValuePtr</I> argument was less than 0.</P>
+#
+# <P>The <I>RecNumber</I> argument was equal to 0, and the <I>DescriptorHandle</I> argument referred to an implicitly allocated APD. (This error does not occur with an explicitly allocated application descriptor, because it is not known whether an explicitly allocated application descriptor is an APD or ARD until execute time.)</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=16%>08S01</TD>
+# <TD width=30%>Communication link failure</TD>
+# <TD width=54%>The communication link between the driver and the data source to which the driver was connected failed before the function completed processing.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=16%>22001</TD>
+# <TD width=30%>String data, right <BR>
+# truncated</TD>
+# <TD width=54%>The <I>FieldIdentifier</I> argument was SQL_DESC_NAME, and the <I>BufferLength</I> argument was a value larger than SQL_MAX_IDENTIFIER_LEN.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=16%>HY000</TD>
+# <TD width=30%>General error</TD>
+# <TD width=54%>An error occurred for which there was no specific SQLSTATE and for which no implementation-specific SQLSTATE was defined. The error message returned by <B>SQLGetDiagRec</B> in the <I>*MessageText</I> buffer describes the error and its cause.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=16%>HY001</TD>
+# <TD width=30%>Memory allocation <BR>
+# error</TD>
+# <TD width=54%>The driver was unable to allocate memory required to support execution or completion of the function.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=16%>HY010</TD>
+# <TD width=30%>Function sequence error</TD>
+# <TD width=54%>(DM) The <I>DescriptorHandle</I> was associated with a <I>StatementHandle</I> for which an asynchronously executing function (not this one) was called and was still executing when this function was called.
+# <P>(DM) <B>SQLExecute</B>, <B>SQLExecDirect</B>, <B>SQLBulkOperations</B>, or <B>SQLSetPos</B> was called for the <I>StatementHandle</I> with which the <I>DescriptorHandle</I> was associated and returned SQL_NEED_DATA. This function was called before data was sent for all data-at-execution parameters or columns.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=16%>HY013</TD>
+# <TD width=30%>Memory management error</TD>
+# <TD width=54%>The function call could not be processed because the underlying memory objects could not be accessed, possibly because of low memory conditions.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=16%>HY016</TD>
+# <TD width=30%>Cannot modify an implementation row descriptor</TD>
+# <TD width=54%>The <I>DescriptorHandle</I> argument was associated with an IRD, and the <I>FieldIdentifier</I> argument was not SQL_DESC_ARRAY_STATUS_PTR or SQL_DESC_ROWS_PROCESSED_PTR.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=16%>HY021</TD>
+# <TD width=30%>Inconsistent descriptor information</TD>
+# <TD width=54%>The SQL_DESC_TYPE and SQL_DESC_DATETIME_INTERVAL_CODE fields do not form a valid ODBC SQL type or a valid driver-specific SQL type (for IPDs) or a valid ODBC C type (for APDs or ARDs).
+# <P>Descriptor information checked during a consistency check was not consistent. (See "Consistency Check" in <B>SQLSetDescRec</B>.)</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=16%>HY090</TD>
+# <TD width=30%>Invalid string or buffer length</TD>
+# <TD width=54%>(DM) <I>*ValuePtr</I> is a character string, and <I>BufferLength</I> was less than zero but was not equal to SQL_NTS.
+# <P>(DM) The driver was an ODBC 2<I>.x</I> driver, the descriptor was an ARD, the <I>ColumnNumber</I> argument was set to 0, and the value specified for the argument <I>BufferLength</I> was not equal to 4. </P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=16%>HY091</TD>
+# <TD width=30%>Invalid descriptor field identifier</TD>
+# <TD width=54%>The value specified for the <I>FieldIdentifier</I> argument was not an ODBC-defined field and was not an implementation-defined value.
+# <P>The <I>FieldIdentifier</I> argument was invalid for the <I>DescriptorHandle</I> argument.</P>
+#
+# <P>The <I>FieldIdentifier</I> argument was a read-only, ODBC-defined field.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=16%>HY092</TD>
+# <TD width=30%>Invalid attribute/option identifier</TD>
+# <TD width=54%>The value in <I>*ValuePtr</I> was not valid for the <I>FieldIdentifier</I> argument.
+# <P>The <I>FieldIdentifier</I> argument was SQL_DESC_UNNAMED, and <I>ValuePtr</I> was SQL_NAMED.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=16%>HY105</TD>
+# <TD width=30%>Invalid parameter type</TD>
+# <TD width=54%>(DM) The value specified for the SQL_DESC_PARAMETER_TYPE field was invalid. (For more information, see the "<I>InputOutputType</I> Argument" section in <B>SQLBindParameter</B>.)</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=16%>HYT01</TD>
+# <TD width=30%>Connection timeout expired</TD>
+# <TD width=54%>The connection timeout period expired before the data source responded to the request. The connection timeout period is set through <B>SQLSetConnectAttr</B>, SQL_ATTR_CONNECTION_TIMEOUT.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=16%>IM001</TD>
+# <TD width=30%>Driver does not support this function</TD>
+# <TD width=54%>(DM) The driver associated with the <I>DescriptorHandle</I> does not support the function.</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Comments</B></P>
+#
+# <P>An application can call <B>SQLSetDescField</B> to set any descriptor field one at a time. One call to <B>SQLSetDescField</B> sets a single field in a single descriptor. This function can be called to set any field in any descriptor type, provided the field can be set. (See the table later in this section.)</P>
+#
+# <P class="indent"><b class="le">Note</b>&nbsp;&nbsp;&nbsp;If a call to <B>SQLSetDescField</B> fails, the contents of the descriptor record identified by the <I>RecNumber</I> argument are undefined.</P>
+#
+# <P>Other functions can be called to set multiple descriptor fields with a single call of the function. The <B>SQLSetDescRec</B> function sets a variety of fields that affect the data type and buffer bound to a column or parameter (the SQL_DESC_TYPE, SQL_DESC_DATETIME_INTERVAL_CODE, SQL_DESC_OCTET_LENGTH, SQL_DESC_PRECISION, SQL_DESC_SCALE, SQL_DESC_DATA_PTR, SQL_DESC_OCTET_LENGTH_PTR, and SQL_DESC_INDICATOR_PTR fields). <B>SQLBindCol </B>or <B>SQLBindParameter</B> can be used to make a complete specification for the binding of a column or parameter. These functions set a specific group of descriptor fields with one function call.</P>
+#
+# <P><B>SQLSetDescField</B> can be called to change the binding buffers by adding an offset to the binding pointers (SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR, or SQL_DESC_OCTET_LENGTH_PTR). This changes the binding buffers without calling <B>SQLBindCol </B>or <B>SQLBindParameter</B>, which allows an application to change SQL_DESC_DATA_PTR without changing other fields, such as SQL_DESC_DATA_TYPE.</P>
+#
+# <P>If an application calls <B>SQLSetDescField</B> to set any field other than SQL_DESC_COUNT or the deferred fields SQL_DESC_DATA_PTR, SQL_DESC_OCTET_LENGTH_PTR, or SQL_DESC_INDICATOR_PTR, the record becomes unbound.</P>
+#
+# <P>Descriptor header fields are set by calling <B>SQLSetDescField </B>with the appropriate <I>FieldIdentifier</I>. Many header fields are also statement attributes, so they can also be set by a call to <B>SQLSetStmtAttr</B>. This allows applications to set a descriptor field without first obtaining a descriptor handle. When <B>SQLSetDescField</B> is called to set a header field, the <I>RecNumber</I> argument is ignored.</P>
+#
+# <P>A <I>RecNumber</I> of 0 is used to set bookmark fields.</P>
+#
+# <P class="indent"><b class="le">Note</b>&nbsp;&nbsp;&nbsp;The statement attribute SQL_ATTR_USE_BOOKMARKS should always be set before calling <B>SQLSetDescField</B> to set bookmark fields. While this is not mandatory, it is strongly recommended.</P>
+#
+# <H1>Sequence of Setting Descriptor Fields</H1>
+#
+# <P>When setting descriptor fields by calling <B>SQLSetDescField</B>, the application must follow a specific sequence:
+#
+# <OL type=1>
+# <LI>The application must first set the SQL_DESC_TYPE, SQL_DESC_CONCISE_TYPE, or SQL_DESC_DATETIME_INTERVAL_CODE field. </li>
+#
+# <LI>After one of these fields has been set, the application can set an attribute of a data type, and the driver sets data type attribute fields to the appropriate default values for the data type. Automatic defaulting of type attribute fields ensures that the descriptor is always ready to use once the application has specified a data type. If the application explicitly sets a data type attribute, it is overriding the default attribute.</li>
+#
+# <LI>After one of the fields listed in step 1 has been set, and data type attributes have been set, the application can set SQL_DESC_DATA_PTR. This prompts a consistency check of descriptor fields. If the application changes the data type or attributes after setting the SQL_DESC_DATA_PTR field, the driver sets SQL_DESC_DATA_PTR to a null pointer, unbinding the record. This forces the application to complete the proper steps in sequence, before the descriptor record is usable.</li>
+# </OL>
+#
+# <H1>Initialization of Descriptor Fields</H1>
+#
+# <P>When a descriptor is allocated, the fields in the descriptor can be initialized to a default value, be initialized without a default value, or be undefined for the type of descriptor. The following tables indicate the initialization of each field for each type of descriptor, with "D" indicating that the field is initialized with a default, and "ND" indicating that the field is initialized without a default. If a number is shown, the default value of the field is that number. The tables also indicate whether a field is read/write (R/W) or read-only (R). </P>
+#
+# <P>The fields of an IRD have a default value only after the statement has been prepared or executed and the IRD has been populated, not when the statement handle or descriptor has been allocated. Until the IRD has been populated, any attempt to gain access to a field of an IRD will return an error.</P>
+#
+# <P>Some descriptor fields are defined for one or more, but not all, of the descriptor types (ARDs and IRDs, and APDs and IPDs). When a field is undefined for a type of descriptor, it is not needed by any of the functions that use that descriptor.</P>
+#
+# <P>The fields that can be accessed by <B>SQLGetDescField</B> cannot necessarily be set by <B>SQLSetDescField</B>. Fields that can be set by <B>SQLSetDescField</B> are listed in the following tables.</P>
+#
+# <P>The initialization of header fields is outlined in the table that follows.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=27%>Header field name</TH>
+# <TH width=21%>Type</TH>
+# <TH width=19%>R/W</TH>
+# <TH width=33%>Default</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_ALLOC_TYPE</TD>
+# <TD width=21%>SQLSMALLINT</TD>
+# <TD width=19%>ARD: R<BR>
+# APD: R<BR>
+# IRD: R<BR>
+# IPD: R </TD>
+# <TD width=33%>ARD: SQL_DESC_ALLOC_AUTO for implicit or SQL_DESC_ALLOC_USER for explicit
+# <P>APD: SQL_DESC_ALLOC_AUTO for implicit or SQL_DESC_ALLOC_USER for explicit</P>
+#
+# <P>IRD: SQL_DESC_ALLOC_AUTO</P>
+#
+# <P>IPD: SQL_DESC_ALLOC_AUTO</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_ARRAY_SIZE</TD>
+# <TD width=21%>SQLUINTEGER</TD>
+# <TD width=19%>ARD: R/W<BR>
+# APD: R/W<BR>
+# IRD: Unused<BR>
+# IPD: Unused</TD>
+# <TD width=33%>ARD:<SUP>[1]</SUP><BR>
+# APD:<SUP>[1]</SUP><BR>
+# IRD: Unused<BR>
+# IPD: Unused</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_ARRAY_STATUS_PTR</TD>
+# <TD width=21%>SQLUSMALLINT*</TD>
+# <TD width=19%>ARD: R/W<BR>
+# APD: R/W<BR>
+# IRD: R/W<BR>
+# IPD: R/W</TD>
+# <TD width=33%>ARD: Null ptr<BR>
+# APD: Null ptr<BR>
+# IRD: Null ptr<BR>
+# IPD: Null ptr</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_BIND_OFFSET_PTR</TD>
+# <TD width=21%>SQLINTEGER*</TD>
+# <TD width=19%>ARD: R/W<BR>
+# APD: R/W<BR>
+# IRD: Unused<BR>
+# IPD: Unused</TD>
+# <TD width=33%>ARD: Null ptr<BR>
+# APD: Null ptr<BR>
+# IRD: Unused<BR>
+# IPD: Unused</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_BIND_TYPE</TD>
+# <TD width=21%>SQLINTEGER</TD>
+# <TD width=19%>ARD: R/W<BR>
+# APD: R/W<BR>
+# IRD: Unused<BR>
+# IPD: Unused</TD>
+# <TD width=33%>ARD: SQL_BIND_BY_COLUMN
+# <P>APD: SQL_BIND_BY_COLUMN</P>
+#
+# <P>IRD: Unused</P>
+#
+# <P>IPD: Unused</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_COUNT</TD>
+# <TD width=21%>SQLSMALLINT</TD>
+# <TD width=19%>ARD: R/W<BR>
+# APD: R/W<BR>
+# IRD: R<BR>
+# IPD: R/W</TD>
+# <TD width=33%>ARD: 0<BR>
+# APD: 0<BR>
+# IRD: D<BR>
+# IPD: 0</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_ROWS_PROCESSED_PTR</TD>
+# <TD width=21%>SQLUINTEGER*</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R/W<BR>
+# IPD: R/W</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: Null ptr<BR>
+# IPD: Null ptr</TD>
+# </TR>
+# </table></div>
+#
+# <P class="fineprint">[1]&nbsp;&nbsp;&nbsp;These fields are defined only when the IPD is automatically populated by the driver. If not, they are undefined. If an application attempts to set these fields, SQLSTATE HY091 (Invalid descriptor field identifier) will be returned.</p>
+# <P>The initialization of record fields is as shown in the following table.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=27%>Record field name</TH>
+# <TH width=21%>Type</TH>
+# <TH width=19%>R/W</TH>
+# <TH width=33%>Default</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_AUTO_UNIQUE_VALUE</TD>
+# <TD width=21%>SQLINTEGER</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: Unused</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: D<BR>
+# IPD: Unused</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_BASE_COLUMN_NAME</TD>
+# <TD width=21%>SQLCHAR *</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: Unused</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: D<BR>
+# IPD: Unused</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_BASE_TABLE_NAME</TD>
+# <TD width=21%>SQLCHAR *</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: Unused</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: D<BR>
+# IPD: Unused</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_CASE_SENSITIVE</TD>
+# <TD width=21%>SQLINTEGER</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: R</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: D<BR>
+# IPD: D<SUP>[1]</SUP></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_CATALOG_NAME</TD>
+# <TD width=21%>SQLCHAR *</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: Unused</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: D<BR>
+# IPD: Unused</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_CONCISE_TYPE</TD>
+# <TD width=21%>SQLSMALLINT</TD>
+# <TD width=19%>ARD: R/W<BR>
+# APD: R/W<BR>
+# IRD: R<BR>
+# IPD: R/W</TD>
+# <TD width=33%>ARD: SQL_C_<BR>
+# DEFAULT<BR>
+# APD: SQL_C_<BR>
+# DEFAULT<BR>
+# IRD: D<BR>
+# IPD: ND</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_DATA_PTR</TD>
+# <TD width=21%>SQLPOINTER</TD>
+# <TD width=19%>ARD: R/W<BR>
+# APD: R/W<BR>
+# IRD: Unused<BR>
+# IPD: Unused</TD>
+# <TD width=33%>ARD: Null ptr<BR>
+# APD: Null ptr<BR>
+# IRD: Unused<BR>
+# IPD: Unused<SUP>[2]</SUP></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_DATETIME_INTERVAL_CODE</TD>
+# <TD width=21%>SQLSMALLINT</TD>
+# <TD width=19%>ARD: R/W<BR>
+# APD: R/W<BR>
+# IRD: R<BR>
+# IPD: R/W</TD>
+# <TD width=33%>ARD: ND<BR>
+# APD: ND<BR>
+# IRD: D<BR>
+# IPD: ND</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_DATETIME_INTERVAL_PRECISION</TD>
+# <TD width=21%>SQLINTEGER</TD>
+# <TD width=19%>ARD: R/W<BR>
+# APD: R/W<BR>
+# IRD: R<BR>
+# IPD: R/W</TD>
+# <TD width=33%>ARD: ND<BR>
+# APD: ND<BR>
+# IRD: D<BR>
+# IPD: ND</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_DISPLAY_SIZE</TD>
+# <TD width=21%>SQLINTEGER</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: Unused</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: D<BR>
+# IPD: Unused</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_FIXED_PREC_SCALE</TD>
+# <TD width=21%>SQLSMALLINT</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: R</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: D<BR>
+# IPD: D<SUP>[1]</SUP></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_INDICATOR_PTR</TD>
+# <TD width=21%>SQLINTEGER *</TD>
+# <TD width=19%>ARD: R/W<BR>
+# APD: R/W<BR>
+# IRD: Unused<BR>
+# IPD: Unused</TD>
+# <TD width=33%>ARD: Null ptr<BR>
+# APD: Null ptr<BR>
+# IRD: Unused<BR>
+# IPD: Unused</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_LABEL</TD>
+# <TD width=21%>SQLCHAR *</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: Unused</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: D<BR>
+# IPD: Unused</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_LENGTH</TD>
+# <TD width=21%>SQLUINTEGER</TD>
+# <TD width=19%>ARD: R/W<BR>
+# APD: R/W<BR>
+# IRD: R<BR>
+# IPD: R/W</TD>
+# <TD width=33%>ARD: ND<BR>
+# APD: ND<BR>
+# IRD: D<BR>
+# IPD: ND</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_LITERAL_PREFIX</TD>
+# <TD width=21%>SQLCHAR *</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: Unused</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: D<BR>
+# IPD: Unused</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_LITERAL_SUFFIX</TD>
+# <TD width=21%>SQLCHAR *</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: Unused</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: D<BR>
+# IPD: Unused</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_LOCAL_TYPE_NAME</TD>
+# <TD width=21%>SQLCHAR *</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: R</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: D<BR>
+# IPD: D<SUP>[1]</SUP></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_NAME</TD>
+# <TD width=21%>SQLCHAR *</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: R/W</TD>
+# <TD width=33%>ARD: ND<BR>
+# APD: ND<BR>
+# IRD: D<BR>
+# IPD: ND</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_NULLABLE</TD>
+# <TD width=21%>SQLSMALLINT</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: R</TD>
+# <TD width=33%>ARD: ND<BR>
+# APD: ND<BR>
+# IRD: D<BR>
+# IPD: ND</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_NUM_PREC_RADIX</TD>
+# <TD width=21%>SQLINTEGER</TD>
+# <TD width=19%>ARD: R/W<BR>
+# APD: R/W<BR>
+# IRD: R<BR>
+# IPD: R/W</TD>
+# <TD width=33%>ARD: ND<BR>
+# APD: ND<BR>
+# IRD: D<BR>
+# IPD: ND</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_OCTET_LENGTH</TD>
+# <TD width=21%>SQLINTEGER</TD>
+# <TD width=19%>ARD: R/W<BR>
+# APD: R/W<BR>
+# IRD: R<BR>
+# IPD: R/W</TD>
+# <TD width=33%>ARD: ND<BR>
+# APD: ND<BR>
+# IRD: D<BR>
+# IPD: ND</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_OCTET_LENGTH_PTR</TD>
+# <TD width=21%>SQLINTEGER *</TD>
+# <TD width=19%>ARD: R/W<BR>
+# APD: R/W<BR>
+# IRD: Unused<BR>
+# IPD: Unused</TD>
+# <TD width=33%>ARD: Null ptr<BR>
+# APD: Null ptr<BR>
+# IRD: Unused<BR>
+# IPD: Unused</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_PARAMETER_TYPE</TD>
+# <TD width=21%>SQLSMALLINT</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: Unused<BR>
+# IPD: R/W</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: Unused<BR>
+# IPD: D=SQL_PARAM_INPUT</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_PRECISION</TD>
+# <TD width=21%>SQLSMALLINT</TD>
+# <TD width=19%>ARD: R/W<BR>
+# APD: R/W<BR>
+# IRD: R<BR>
+# IPD: R/W</TD>
+# <TD width=33%>ARD: ND<BR>
+# APD: ND<BR>
+# IRD: D<BR>
+# IPD: ND</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_ROWVER</TD>
+# <TD width=21%>SQLSMALLINT</TD>
+# <TD width=19%>ARD: Unused
+# <P>APD: Unused</P>
+#
+# <P>IRD: R</P>
+#
+# <P>IPD: R</P>
+# </TD>
+# <TD width=33%>ARD: Unused
+# <P>APD: Unused</P>
+#
+# <P>IRD: ND</P>
+#
+# <P>IPD: ND</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_SCALE</TD>
+# <TD width=21%>SQLSMALLINT</TD>
+# <TD width=19%>ARD: R/W<BR>
+# APD: R/W<BR>
+# IRD: R<BR>
+# IPD: R/W</TD>
+# <TD width=33%>ARD: ND<BR>
+# APD: ND<BR>
+# IRD: D<BR>
+# IPD: ND</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_SCHEMA_NAME</TD>
+# <TD width=21%>SQLCHAR *</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: Unused</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: D<BR>
+# IPD: Unused</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_SEARCHABLE</TD>
+# <TD width=21%>SQLSMALLINT</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: Unused</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: D<BR>
+# IPD: Unused</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_TABLE_NAME</TD>
+# <TD width=21%>SQLCHAR *</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: Unused</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: D<BR>
+# IPD: Unused</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_TYPE</TD>
+# <TD width=21%>SQLSMALLINT</TD>
+# <TD width=19%>ARD: R/W<BR>
+# APD: R/W<BR>
+# IRD: R<BR>
+# IPD: R/W</TD>
+# <TD width=33%>ARD: SQL_C_DEFAULT<BR>
+# APD: SQL_C_DEFAULT<BR>
+# IRD: D<BR>
+# IPD: ND</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_TYPE_NAME</TD>
+# <TD width=21%>SQLCHAR *</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: R</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: D<BR>
+# IPD: D<SUP>[1]</SUP></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_UNNAMED</TD>
+# <TD width=21%>SQLSMALLINT</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: R/W</TD>
+# <TD width=33%>ARD: ND<BR>
+# APD: ND<BR>
+# IRD: D<BR>
+# IPD: ND</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_UNSIGNED</TD>
+# <TD width=21%>SQLSMALLINT</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: R</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: D<BR>
+# IPD: D<SUP>[1]</SUP></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>SQL_DESC_UPDATABLE</TD>
+# <TD width=21%>SQLSMALLINT</TD>
+# <TD width=19%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: R<BR>
+# IPD: Unused</TD>
+# <TD width=33%>ARD: Unused<BR>
+# APD: Unused<BR>
+# IRD: D<BR>
+# IPD: Unused</TD>
+# </TR>
+# </table></div>
+#
+# <P class="fineprint">[1]&nbsp;&nbsp;&nbsp;These fields are defined only when the IPD is automatically populated by the driver. If not, they are undefined. If an application attempts to set these fields, SQLSTATE HY091 (Invalid descriptor field identifier) will be returned.</p>
+# <P class="fineprint">[2]&nbsp;&nbsp;&nbsp;The SQL_DESC_DATA_PTR field in the IPD can be set to force a consistency check. In a subsequent call to <B>SQLGetDescField</B> or <B>SQLGetDescRec</B>, the driver is not required to return the value that SQL_DESC_DATA_PTR was set to.</p>
+# <P class="label"><B><I>FieldIdentifier</I> Argument</B></P>
+#
+# <P>The <I>FieldIdentifier</I> argument indicates the descriptor field to be set. A descriptor contains the <I>descriptor header,</I> consisting of the header fields described in the next section, "Header Fields," and zero or more <I>descriptor records,</I> consisting of the record fields described in the section following the "Header Fields" section.</P>
+#
+# <H1>Header Fields</H1>
+#
+# <P>Each descriptor has a header consisting of the following fields:
+#
+# <DL>
+# <DT><B>SQL_DESC_ALLOC_TYPE [All]</B></DT>
+#
+# <DD>This read-only SQLSMALLINT header field specifies whether the descriptor was allocated automatically by the driver or explicitly by the application. The application can obtain, but not modify, this field. The field is set to SQL_DESC_ALLOC_AUTO by the driver if the descriptor was automatically allocated by the driver. It is set to SQL_DESC_ALLOC_USER by the driver if the descriptor was explicitly allocated by the application.</dd>
+#
+# <DT><B>SQL_DESC_ARRAY_SIZE [Application descriptors]</B></DT>
+#
+# <DD>In ARDs, this SQLUINTEGER header field specifies the number of rows in the rowset. This is the number of rows to be returned by a call to <B>SQLFetch</B> or <B>SQLFetchScroll</B> or to be operated on by a call to <B>SQLBulkOperations</B> or <B>SQLSetPos</B>.
+#
+# <P>In APDs, this SQLUINTEGER header field specifies the number of values for each parameter.
+#
+#
+# <P>The default value of this field is 1. If SQL_DESC_ARRAY_SIZE is greater than 1, SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR, and SQL_DESC_OCTET_LENGTH_PTR of the APD or ARD point to arrays. The cardinality of each array is equal to the value of this field.
+#
+#
+# <P>This field in the ARD can also be set by calling <B>SQLSetStmtAttr</B> with the SQL_ATTR_ROW_ARRAY_SIZE attribute. This field in the APD can also be set by calling <B>SQLSetStmtAttr</B> with the SQL_ATTR_PARAMSET_SIZE attribute.
+# </dd>
+#
+# <DT><B>SQL_DESC_ARRAY_STATUS_PTR [All]</B></DT>
+#
+# <DD>For each descriptor type, this SQLUSMALLINT * header field points to an array of SQLUSMALLINT values. These arrays are named as follows: row status array (IRD), parameter status array (IPD), row operation array (ARD), and parameter operation array (APD).
+#
+# <P>In the IRD, this header field points to a row status array containing status values after a call to <B>SQLBulkOperations</B>, <B>SQLFetch</B>, <B>SQLFetchScroll</B>, or <B>SQLSetPos</B>. The array has as many elements as there are rows in the rowset. The application must allocate an array of SQLUSMALLINTs and set this field to point to the array. The field is set to a null pointer by default. The driver will populate the array&#0151;unless the SQL_DESC_ARRAY_STATUS_PTR field is set to a null pointer, in which case no status values are generated and the array is not populated.
+#
+#
+# <P class="indent"><b class="le">Caution</b>&nbsp;&nbsp;&nbsp;Driver behavior is undefined if the application sets the elements of the row status array pointed to by the SQL_DESC_ARRAY_STATUS_PTR field of the IRD.
+#
+#
+# <P>The array is initially populated by a call to <B>SQLBulkOperations</B>, <B>SQLFetch</B>, <B>SQLFetchScroll</B>, or <B>SQLSetPos</B>. If the call did not return SQL_SUCCESS or SQL_SUCCESS_WITH_INFO, the contents of the array pointed to by this field are undefined. The elements in the array can contain the following values:
+#
+#
+# <UL type=disc>
+# <LI>SQL_ROW_SUCCESS: The row was successfully fetched and has not changed since it was last fetched.</li>
+#
+# <LI>SQL_ROW_SUCCESS_WITH_INFO: The row was successfully fetched and has not changed since it was last fetched. However, a warning was returned about the row.</li>
+#
+# <LI>SQL_ROW_ERROR: An error occurred while fetching the row.</li>
+#
+# <LI>SQL_ROW_UPDATED: The row was successfully fetched and has been updated since it was last fetched. If the row is fetched again, its status is SQL_ROW_SUCCESS.</li>
+#
+# <LI>SQL_ROW_DELETED: The row has been deleted since it was last fetched.</li>
+#
+# <LI>SQL_ROW_ADDED: The row was inserted by <B>SQLBulkOperations</B>. If the row is fetched again, its status is SQL_ROW_SUCCESS.</li>
+#
+# <LI>SQL_ROW_NOROW: The rowset overlapped the end of the result set, and no row was returned that corresponded to this element of the row status array.</li>
+# </UL>
+#
+#
+# <P>This field in the IRD can also be set by calling <B>SQLSetStmtAttr</B> with the SQL_ATTR_ROW_STATUS_PTR attribute.
+#
+#
+# <P>The SQL_DESC_ARRAY_STATUS_PTR field of the IRD is valid only after SQL_SUCCESS or SQL_SUCCESS_WITH_INFO has been returned. If the return code is not one of these, the location pointed to by SQL_DESC_ROWS_PROCESSED_PTR is undefined.
+#
+#
+# <P>In the IPD, this header field points to a parameter status array containing status information for each set of parameter values after a call to <B>SQLExecute</B> or <B>SQLExecDirect</B>. If the call to <B>SQLExecute</B> or <B>SQLExecDirect</B> did not return SQL_SUCCESS or SQL_SUCCESS_WITH_INFO, the contents of the array pointed to by this field are undefined. The application must allocate an array of SQLUSMALLINTs and set this field to point to the array. The driver will populate the array&#0151;unless the SQL_DESC_ARRAY_STATUS_PTR field is set to a null pointer, in which case no status values are generated and the array is not populated. The elements in the array can contain the following values:
+#
+#
+# <UL type=disc>
+# <LI>SQL_PARAM_SUCCESS: The SQL statement was successfully executed for this set of parameters.</li>
+#
+# <LI>SQL_PARAM_SUCCESS_WITH_INFO: The SQL statement was successfully executed for this set of parameters; however, warning information is available in the diagnostics data structure.</li>
+#
+# <LI>SQL_PARAM_ERROR: An error occurred in processing this set of parameters. Additional error information is available in the diagnostics data structure.</li>
+#
+# <LI>SQL_PARAM_UNUSED: This parameter set was unused, possibly due to the fact that some previous parameter set caused an error that aborted further processing, or because SQL_PARAM_IGNORE was set for that set of parameters in the array specified by the SQL_DESC_ARRAY_STATUS_PTR field of the APD.</li>
+#
+# <LI>SQL_PARAM_DIAG_UNAVAILABLE: Diagnostic information is not available. An example of this is when the driver treats arrays of parameters as a monolithic unit and so does not generate this level of error information.</li>
+# </UL>
+#
+#
+# <P>This field in the IPD can also be set by calling <B>SQLSetStmtAttr</B> with the SQL_ATTR_PARAM_STATUS_PTR attribute.
+#
+#
+# <P>In the ARD, this header field points to a row operation array of values that can be set by the application to indicate whether this row is to be ignored for <B>SQLSetPos</B> operations. The elements in the array can contain the following values:
+#
+#
+# <UL type=disc>
+# <LI>SQL_ROW_PROCEED: The row is included in the bulk operation using <B>SQLSetPos</B>. (This setting does not guarantee that the operation will occur on the row. If the row has the status SQL_ROW_ERROR in the IRD row status array, the driver might not be able to perform the operation in the row.)</li>
+#
+# <LI>SQL_ROW_IGNORE: The row is excluded from the bulk operation using <B>SQLSetPos</B>.</li>
+# </UL>
+#
+#
+# <P>If no elements of the array are set, all rows are included in the bulk operation. If the value in the SQL_DESC_ARRAY_STATUS_PTR field of the ARD is a null pointer, all rows are included in the bulk operation; the interpretation is the same as if the pointer pointed to a valid array and all elements of the array were SQL_ROW_PROCEED. If an element in the array is set to SQL_ROW_IGNORE, the value in the row status array for the ignored row is not changed.
+#
+#
+# <P>This field in the ARD can also be set by calling <B>SQLSetStmtAttr</B> with the SQL_ATTR_ROW_OPERATION_PTR attribute.
+#
+#
+# <P>In the APD, this header field points to a parameter operation array of values that can be set by the application to indicate whether this set of parameters is to be ignored when <B>SQLExecute</B> or<B> SQLExecDirect</B> is called. The elements in the array can contain the following values:
+#
+#
+# <UL type=disc>
+# <LI>SQL_PARAM_PROCEED: The set of parameters is included in the <B>SQLExecute</B> or <B>SQLExecDirect</B> call.</li>
+#
+# <LI>SQL_PARAM_IGNORE: The set of parameters is excluded from the <B>SQLExecute</B> or <B>SQLExecDirect</B> call.</li>
+# </UL>
+#
+#
+# <P>If no elements of the array are set, all sets of parameters in the array are used in the <B>SQLExecute</B> or <B>SQLExecDirect</B> calls. If the value in the SQL_DESC_ARRAY_STATUS_PTR field of the APD is a null pointer, all sets of parameters are used; the interpretation is the same as if the pointer pointed to a valid array and all elements of the array were SQL_PARAM_PROCEED.
+#
+#
+# <P>This field in the APD can also be set by calling <B>SQLSetStmtAttr</B> with the SQL_ATTR_PARAM_OPERATION_PTR attribute.
+# </dd>
+#
+# <DT><B>SQL_DESC_BIND_OFFSET_PTR [Application descriptors]</B></DT>
+#
+# <DD>This SQLINTEGER * header field points to the binding offset. It is set to a null pointer by default. If this field is not a null pointer, the driver dereferences the pointer and adds the dereferenced value to each of the deferred fields that has a non-null value in the descriptor record (SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR, and SQL_DESC_OCTET_LENGTH_PTR) at fetch time and uses the new pointer values when binding.
+#
+# <P>The binding offset is always added directly to the values in the SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR, and SQL_DESC_OCTET_LENGTH_PTR fields. If the offset is changed to a different value, the new value is still added directly to the value in each descriptor field. The new offset is not added to the field value plus any earlier offset.
+#
+#
+# <P>This field is a <I>deferred field</I>: It is not used at the time it is set but is used at a later time by the driver when it needs to determine addresses for data buffers.
+#
+#
+# <P>This field in the ARD can also be set by calling <B>SQLSetStmtAttr</B> with the SQL_ATTR_ROW_BIND_OFFSET_PTR attribute. This field in the ARD can also be set by calling <B>SQLSetStmtAttr</B> with the SQL_ATTR_PARAM_BIND_OFFSET_PTR attribute.
+#
+#
+# <P>For more information, see the description of row-wise binding in <A HREF="odbcsqlfetchscroll.htm">SQLFetchScroll</A> and <A HREF="odbcsqlbindparameter.htm">SQLBindParameter</A>.
+# </dd>
+#
+# <DT><B>SQL_DESC_BIND_TYPE [Application descriptors]</B></DT>
+#
+# <DD>This SQLUINTEGER header field sets the binding orientation to be used for binding either columns or parameters.
+#
+# <P>In ARDs, this field specifies the binding orientation when <B>SQLFetchScroll</B> or <B>SQLFetch</B> is called on the associated statement handle.
+#
+#
+# <P>To select column-wise binding for columns, this field is set to SQL_BIND_BY_COLUMN (the default).
+#
+#
+# <P>This field in the ARD can also be set by calling <B>SQLSetStmtAttr</B> with the SQL_ATTR_ROW_BIND_TYPE <I>Attribute</I>.
+#
+#
+# <P>In APDs, this field specifies the binding orientation to be used for dynamic parameters.
+#
+#
+# <P>To select column-wise binding for parameters, this field is set to SQL_BIND_BY_COLUMN (the default).
+#
+#
+# <P>This field in the APD can also be set by calling <B>SQLSetStmtAttr</B> with the SQL_ATTR_PARAM_BIND_TYPE <I>Attribute</I>.
+# </dd>
+#
+# <DT><B>SQL_DESC_COUNT [All]</B></DT>
+#
+# <DD>This SQLSMALLINT header field specifies the 1-based index of the highest-numbered record that contains data. When the driver sets the data structure for the descriptor, it must also set the SQL_DESC_COUNT field to show how many records are significant. When an application allocates an instance of this data structure, it does not have to specify how many records to reserve room for. As the application specifies the contents of the records, the driver takes any required action to ensure that the descriptor handle refers to a data structure of the adequate size.
+#
+# <P>SQL_DESC_COUNT is not a count of all data columns that are bound (if the field is in an ARD) or of all parameters that are bound (if the field is in an APD), but the number of the highest-numbered record. If the highest-numbered column or parameter is unbound, then SQL_DESC_COUNT is changed to the number of the next highest-numbered column or parameter. If a column or a parameter with a number that is less than the number of the highest-numbered column is unbound (by calling <B>SQLBindCol</B> with the <I>TargetValuePtr</I> argument set to a null pointer, or <B>SQLBindParameter</B> with the <I>ParameterValuePtr</I> argument set to a null pointer), SQL_DESC_COUNT is not changed. If additional columns or parameters are bound with numbers greater than the highest-numbered record that contains data, the driver automatically increases the value in the SQL_DESC_COUNT field. If all columns are unbound by calling <B>SQLFreeStmt</B> with the SQL_UNBIND option, the SQL_DESC_COUNT fields in the ARD and IRD are set to 0. If <B>SQLFreeStmt</B> is called with the SQL_RESET_PARAMS option, the SQL_DESC_COUNT fields in the APD and IPD are set to 0.
+#
+#
+# <P>The value in SQL_DESC_COUNT can be set explicitly by an application by calling <B>SQLSetDescField</B>. If the value in SQL_DESC_COUNT is explicitly decreased, all records with numbers greater than the new value in SQL_DESC_COUNT are effectively removed. If the value in SQL_DESC_COUNT is explicitly set to 0 and the field is in an ARD, all data buffers except a bound bookmark column are released.
+#
+#
+# <P>The record count in this field of an ARD does not include a bound bookmark column. The only way to unbind a bookmark column is to set the SQL_DESC_DATA_PTR field to a null pointer.
+# </dd>
+#
+# <DT><B>SQL_DESC_ROWS_PROCESSED_PTR [Implementation descriptors]</B></DT>
+#
+# <DD>In an IRD, this SQLUINTEGER * header field points to a buffer containing the number of rows fetched after a call to <B>SQLFetch</B> or <B>SQLFetchScroll</B>, or the number of rows affected in a bulk operation performed by a call to <B>SQLBulkOperations</B> or <B>SQLSetPos</B>, including error rows.
+#
+# <P>In an IPD, this SQLUINTEGER * header field points to a buffer containing the number of sets of parameters that have been processed, including error sets. No number will be returned if this is a null pointer.
+#
+#
+# <P>SQL_DESC_ROWS_PROCESSED_PTR is valid only after SQL_SUCCESS or SQL_SUCCESS_WITH_INFO has been returned after a call to <B>SQLFetch</B> or <B>SQLFetchScroll </B>(for an IRD field) or <B>SQLExecute</B>, <B>SQLExecDirect</B>, or <B>SQLParamData</B> (for an IPD field). If the call that fills in the buffer pointed to by this field does not return SQL_SUCCESS or SQL_SUCCESS_WITH_INFO, the contents of the buffer are undefined, unless it returns SQL_NO_DATA, in which case the value in the buffer is set to 0.
+#
+#
+# <P>This field in the ARD can also be set by calling <B>SQLSetStmtAttr</B> with the SQL_ATTR_ROWS_FETCHED_PTR attribute. This field in the APD can also be set by calling <B>SQLSetStmtAttr</B> with the SQL_ATTR_PARAMS_PROCESSED_PTR attribute.
+#
+#
+# <P>The buffer pointed to by this field is allocated by the application. It is a deferred output buffer that is set by the driver. It is set to a null pointer by default.
+# </dd>
+# </DL>
+#
+# <H1>Record Fields</H1>
+#
+# <P>Each descriptor contains one or more records consisting of fields that define either column data or dynamic parameters, depending on the type of descriptor. Each record is a complete definition of a single column or parameter.
+#
+# <DL>
+# <DT><B>SQL_DESC_AUTO_UNIQUE_VALUE [IRDs]</B></DT>
+#
+# <DD>This read-only SQLINTEGER record field contains SQL_TRUE if the column is an auto-incrementing column, or SQL_FALSE if the column is not an auto-incrementing column. This field is read-only, but the underlying auto-incrementing column is not necessarily read-only.</dd>
+#
+# <DT><B>SQL_DESC_BASE_COLUMN_NAME [IRDs]</B></DT>
+#
+# <DD>This read-only SQLCHAR * record field contains the base column name for the result set column. If a base column name does not exist (as in the case of columns that are expressions), this variable contains an empty string.</dd>
+#
+# <DT><B>SQL_DESC_BASE_TABLE_NAME [IRDs]</B></DT>
+#
+# <DD>This read-only SQLCHAR * record field contains the base table name for the result set column. If a base table name cannot be defined or is not applicable, this variable contains an empty string.</dd>
+#
+# <DT><B>SQL_DESC_CASE_SENSITIVE [Implementation descriptors]</B></DT>
+#
+# <DD>This read-only SQLINTEGER record field contains SQL_TRUE if the column or parameter is treated as case-sensitive for collations and comparisons, or SQL_FALSE if the column is not treated as case-sensitive for collations and comparisons or if it is a noncharacter column.</dd>
+#
+# <DT><B>SQL_DESC_CATALOG_NAME [IRDs]</B></DT>
+#
+# <DD>This read-only SQLCHAR * record field contains the catalog for the base table that contains the column. The return value is driver-dependent if the column is an expression or if the column is part of a view. If the data source does not support catalogs or the catalog cannot be determined, this variable contains an empty string.</dd>
+#
+# <DT><B>SQL_DESC_CONCISE_TYPE [All]</B></DT>
+#
+# <DD>This SQLSMALLINT header field specifies the concise data type for all data types, including the datetime and interval data types.
+#
+# <P>The values in the SQL_DESC_CONCISE_TYPE, SQL_DESC_TYPE, and SQL_DESC_DATETIME_INTERVAL_CODE fields are interdependent. Each time one of the fields is set, the other must also be set. SQL_DESC_CONCISE_TYPE can be set by a call to <B>SQLBindCol</B> or <B>SQLBindParameter</B>, or <B>SQLSetDescField</B>. SQL_DESC_TYPE can be set by a call to <B>SQLSetDescField</B> or <B>SQLSetDescRec</B>.
+#
+#
+# <P>If SQL_DESC_CONCISE_TYPE is set to a concise data type other than an interval or datetime data type, the SQL_DESC_TYPE field is set to the same value and the SQL_DESC_DATETIME_INTERVAL_CODE field is set to 0.
+#
+#
+# <P>If SQL_DESC_CONCISE_TYPE is set to the concise datetime or interval data type, the SQL_DESC_TYPE field is set to the corresponding verbose type (SQL_DATETIME or SQL_INTERVAL) and the SQL_DESC_DATETIME_INTERVAL_CODE field is set to the appropriate subcode.
+# </dd>
+#
+# <DT><B>SQL_DESC_DATA_PTR [Application descriptors and IPDs]</B></DT>
+#
+# <DD>This SQLPOINTER record field points to a variable that will contain the parameter value (for APDs) or the column value (for ARDs). This field is a <I>deferred field</I>. It is not used at the time it is set but is used at a later time by the driver to retrieve data.
+#
+# <P>The column specified by the SQL_DESC_DATA_PTR field of the ARD is unbound if the <I>TargetValuePtr</I> argument in a call to <B>SQLBindCol</B> is a null pointer or if the SQL_DESC_DATA_PTR field in the ARD is set by a call to <B>SQLSetDescField</B> or <B>SQLSetDescRec</B> to a null pointer. Other fields are not affected if the SQL_DESC_DATA_PTR field is set to a null pointer.
+#
+#
+# <P>If the call to <B>SQLFetch</B> or <B>SQLFetchScroll </B>that fills in the buffer pointed to by this field did not return SQL_SUCCESS or SQL_SUCCESS_WITH_INFO, the contents of the buffer are undefined.
+#
+#
+# <P>Whenever the SQL_DESC_DATA_PTR field of an APD, ARD, or IPD is set, the driver checks that the value in the SQL_DESC_TYPE field contains one of the valid ODBC C data types or a driver-specific data type, and that all other fields affecting the data types are consistent. Prompting a consistency check is the only use of the SQL_DESC_DATA_PTR field of an IPD. Specifically, if an application sets the SQL_DESC_DATA_PTR field of an IPD and later calls <B>SQLGetDescField</B> on this field, it is not necessarily returned the value that it had set. For more information, see "Consistency Checks" in <A HREF="odbcsqlsetdescrec.htm">SQLSetDescRec</A>.
+# </dd>
+#
+# <DT><B>SQL_DESC_DATETIME_INTERVAL_CODE [All]</B></DT>
+#
+# <DD>This SQLSMALLINT record field contains the subcode for the specific datetime or interval data type when the SQL_DESC_TYPE field is SQL_DATETIME or SQL_INTERVAL. This is true for both SQL and C data types. The code consists of the data type name with "CODE" substituted for either "TYPE" or "C_TYPE" (for datetime types), or "CODE" substituted for "INTERVAL" or "C_INTERVAL" (for interval types).
+#
+# <P>If SQL_DESC_TYPE and SQL_DESC_CONCISE_TYPE in an application descriptor are set to SQL_C_DEFAULT and the descriptor is not associated with a statement handle, the contents of SQL_DESC_DATETIME_INTERVAL_CODE are undefined.
+#
+#
+# <P>This field can be set for the datetime data types listed in the following table.
+#
+# <!--TS:-->
+# <div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=50%>Datetime types</TH>
+# <TH width=50%>DATETIME_INTERVAL_CODE</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_TYPE_DATE/SQL_C_TYPE_DATE</TD>
+# <TD width=50%>SQL_CODE_DATE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_TYPE_TIME/SQL_C_TYPE_TIME</TD>
+# <TD width=50%>SQL_CODE_TIME</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_TYPE_TIMESTAMP/<BR>
+# SQL_C_TYPE_TIMESTAMP</TD>
+# <TD width=50%>SQL_CODE_TIMESTAMP</TD>
+# </TR>
+# </table></div>
+#
+# <!--TS:-->
+#
+# <P>This field can be set for the interval data types listed in the following table.
+#
+# <!--TS:-->
+# <div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=50%>Interval type</TH>
+# <TH width=50%>DATETIME_INTERVAL_CODE</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_INTERVAL_DAY/<BR>
+# SQL_C_INTERVAL_DAY</TD>
+# <TD width=50%>SQL_CODE_DAY</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_INTERVAL_DAY_TO_HOUR/<BR>
+# SQL_C_INTERVAL_DAY_TO_HOUR</TD>
+# <TD width=50%>SQL_CODE_DAY_TO_HOUR</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_INTERVAL_DAY_TO_MINUTE/<BR>
+# SQL_C_INTERVAL_DAY_TO_MINUTE</TD>
+# <TD width=50%>SQL_CODE_DAY_TO_MINUTE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_INTERVAL_DAY_TO_SECOND/<BR>
+# SQL_C_INTERVAL_DAY_TO_SECOND</TD>
+# <TD width=50%>SQL_CODE_DAY_TO_SECOND</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_INTERVAL_HOUR/<BR>
+# SQL_C_INTERVAL_HOUR</TD>
+# <TD width=50%>SQL_CODE_HOUR</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_INTERVAL_HOUR_TO_MINUTE/<BR>
+# SQL_C_INTERVAL_HOUR_TO_MINUTE</TD>
+# <TD width=50%>SQL_CODE_HOUR_TO_MINUTE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_INTERVAL_HOUR_TO_SECOND/<BR>
+# SQL_C_INTERVAL_HOUR_TO_SECOND</TD>
+# <TD width=50%>SQL_CODE_HOUR_TO_SECOND</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_INTERVAL_MINUTE/<BR>
+# SQL_C_INTERVAL_MINUTE</TD>
+# <TD width=50%>SQL_CODE_MINUTE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_INTERVAL_MINUTE_TO_SECOND/<BR>
+# SQL_C_INTERVAL_MINUTE_TO_SECOND</TD>
+# <TD width=50%>SQL_CODE_MINUTE_TO_SECOND</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_INTERVAL_MONTH/<BR>
+# SQL_C_INTERVAL_MONTH</TD>
+# <TD width=50%>SQL_CODE_MONTH</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_INTERVAL_SECOND/<BR>
+# SQL_C_INTERVAL_SECOND</TD>
+# <TD width=50%>SQL_CODE_SECOND</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_INTERVAL_YEAR/<BR>
+# SQL_C_INTERVAL_YEAR</TD>
+# <TD width=50%>SQL_CODE_YEAR</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_INTERVAL_YEAR_TO_MONTH/<BR>
+# SQL_C_INTERVAL_YEAR_TO_MONTH</TD>
+# <TD width=50%>SQL_CODE_YEAR_TO_MONTH</TD>
+# </TR>
+# </table></div>
+#
+# <!--TS:-->
+#
+# <P>For more information about the data intervals and this field, see "<A HREF="odbcdata_type_identifiers_and_descriptors.htm">Data Type Identifiers and Descriptors</A>" in Appendix D: Data Types.
+# </dd>
+#
+# <DT><B>SQL_DESC_DATETIME_INTERVAL_PRECISION [All]</B></DT>
+#
+# <DD>This SQLINTEGER record field contains the interval leading precision if the SQL_DESC_TYPE field is SQL_INTERVAL. When the SQL_DESC_DATETIME_INTERVAL_CODE field is set to an interval data type, this field is set to the default interval leading precision.</dd>
+#
+# <DT><B>SQL_DESC_DISPLAY_SIZE [IRDs]</B></DT>
+#
+# <DD>This read-only SQLINTEGER record field contains the maximum number of characters required to display the data from the column. </dd>
+#
+# <DT><B>SQL_DESC_FIXED_PREC_SCALE [Implementation descriptors]</B></DT>
+#
+# <DD>This read-only SQLSMALLINT record field is set to SQL_TRUE if the column is an exact numeric column and has a fixed precision and nonzero scale, or to SQL_FALSE if the column is not an exact numeric column with a fixed precision and scale.</dd>
+#
+# <DT><B>SQL_DESC_INDICATOR_PTR [Application descriptors]</B></DT>
+#
+# <DD>In ARDs, this SQLINTEGER * record field points to the indicator variable. This variable contains SQL_NULL_DATA if the column value is a NULL. For APDs, the indicator variable is set to SQL_NULL_DATA to specify NULL dynamic arguments. Otherwise, the variable is zero (unless the values in SQL_DESC_INDICATOR_PTR and SQL_DESC_OCTET_LENGTH_PTR are the same pointer).
+#
+# <P>If the SQL_DESC_INDICATOR_PTR field in an ARD is a null pointer, the driver is prevented from returning information about whether the column is NULL or not. If the column is NULL and SQL_DESC_INDICATOR_PTR is a null pointer, SQLSTATE 22002 (Indicator variable required but not supplied) is returned when the driver attempts to populate the buffer after a call to <B>SQLFetch</B> or <B>SQLFetchScroll</B>. If the call to <B>SQLFetch</B> or <B>SQLFetchScroll </B>did not return SQL_SUCCESS or SQL_SUCCESS_WITH_INFO, the contents of the buffer are undefined.
+#
+#
+# <P>The SQL_DESC_INDICATOR_PTR field determines whether the field pointed to by SQL_DESC_OCTET_LENGTH_PTR is set. If the data value for a column is NULL, the driver sets the indicator variable to SQL_NULL_DATA. The field pointed to by SQL_DESC_OCTET_LENGTH_PTR is then not set. If a NULL value is not encountered during the fetch, the buffer pointed to by SQL_DESC_INDICATOR_PTR is set to zero and the buffer pointed to by SQL_DESC_OCTET_LENGTH_PTR is set to the length of the data.
+#
+#
+# <P>If the SQL_DESC_INDICATOR_PTR field in an APD is a null pointer, the application cannot use this descriptor record to specify NULL arguments.
+#
+#
+# <P>This field is a <I>deferred field</I>: It is not used at the time it is set but is used at a later time by the driver to indicate nullability (for ARDs) or to determine nullability (for APDs).
+# </dd>
+#
+# <DT><B>SQL_DESC_LABEL [IRDs]</B></DT>
+#
+# <DD>This read-only SQLCHAR * record field contains the column label or title. If the column does not have a label, this variable contains the column name. If the column is unnamed and unlabeled, this variable contains an empty string.</dd>
+#
+# <DT><B>SQL_DESC_LENGTH [All]</B></DT>
+#
+# <DD>This SQLUINTEGER record field is either the maximum or actual length of a character string in characters or a binary data type in bytes. It is the maximum length for a fixed-length data type, or the actual length for a variable-length data type. Its value always excludes the null-termination character that ends the character string. For values whose type is SQL_TYPE_DATE, SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP, or one of the SQL interval data types, this field has the length in characters of the character string representation of the datetime or interval value.
+#
+# <P>The value in this field may be different from the value for "length" as defined in ODBC 2<I>.x</I>. For more information, see <A HREF="odbcdata_types.htm">Appendix D: Data Types</A>.
+# </dd>
+#
+# <DT><B>SQL_DESC_LITERAL_PREFIX [IRDs]</B></DT>
+#
+# <DD>This read-only SQLCHAR * record field contains the character or characters that the driver recognizes as a prefix for a literal of this data type. This variable contains an empty string for a data type for which a literal prefix is not applicable.</dd>
+#
+# <DT><B>SQL_DESC_LITERAL_SUFFIX [IRDs]</B></DT>
+#
+# <DD>This read-only SQLCHAR * record field contains the character or characters that the driver recognizes as a suffix for a literal of this data type. This variable contains an empty string for a data type for which a literal suffix is not applicable.</dd>
+#
+# <DT><B>SQL_DESC_LOCAL_TYPE_NAME [Implementation descriptors]</B></DT>
+#
+# <DD>This read-only SQLCHAR * record field contains any localized (native language) name for the data type that may be different from the regular name of the data type. If there is no localized name, an empty string is returned. This field is for display purposes only.</dd>
+#
+# <DT><B>SQL_DESC_NAME [Implementation descriptors]</B></DT>
+#
+# <DD>This SQLCHAR * record field in a row descriptor contains the column alias, if it applies. If the column alias does not apply, the column name is returned. In either case, the driver sets the SQL_DESC_UNNAMED field to SQL_NAMED when it sets the SQL_DESC_NAME field. If there is no column name or a column alias, the driver returns an empty string in the SQL_DESC_NAME field and sets the SQL_DESC_UNNAMED field to SQL_UNNAMED.
+#
+# <P>An application can set the SQL_DESC_NAME field of an IPD to a parameter name or alias to specify stored procedure parameters by name. (For more information, see "<A HREF="odbcbinding_parameters_by_name__named_parameters_.htm">Binding Parameters by Name (Named Parameters)</A>" in Chapter 9: Executing Statements.) The SQL_DESC_NAME field of an IRD is a read-only field; SQLSTATE HY091 (Invalid descriptor field identifier) will be returned if an application attempts to set it.
+#
+#
+# <P>In IPDs, this field is undefined if the driver does not support named parameters. If the driver supports named parameters and is capable of describing parameters, the parameter name is returned in this field.
+# </dd>
+#
+# <DT><B>SQL_DESC_NULLABLE [Implementation descriptors]</B></DT>
+#
+# <DD>In IRDs, this read-only SQLSMALLINT record field is SQL_NULLABLE if the column can have NULL values, SQL_NO_NULLS if the column does not have NULL values, or SQL_NULLABLE_UNKNOWN if it is not known whether the column accepts NULL values. This field pertains to the result set column, not the base column.
+#
+# <P>In IPDs, this field is always set to SQL_NULLABLE because dynamic parameters are always nullable and cannot be set by an application.
+# </dd>
+#
+# <DT><B>SQL_DESC_NUM_PREC_RADIX [All]</B></DT>
+#
+# <DD>This SQLINTEGER field contains a value of 2 if the data type in the SQL_DESC_TYPE field is an approximate numeric data type, because the SQL_DESC_PRECISION field contains the number of bits. This field contains a value of 10 if the data type in the SQL_DESC_TYPE field is an exact numeric data type, because the SQL_DESC_PRECISION field contains the number of decimal digits. This field is set to 0 for all non-numeric data types.</dd>
+#
+# <DT><B>SQL_DESC_OCTET_LENGTH [All]</B></DT>
+#
+# <DD>This SQLINTEGER record field contains the length, in bytes, of a character string or binary data type. For fixed-length character or binary types, this is the actual length in bytes. For variable-length character or binary types, this is the maximum length in bytes. This value always excludes space for the null-termination character for implementation descriptors and always includes space for the null-termination character for application descriptors. For application data, this field contains the size of the buffer. For APDs, this field is defined only for output or input/output parameters.</dd>
+#
+# <DT><B>SQL_DESC_OCTET_LENGTH_PTR [Application descriptors]</B></DT>
+#
+# <DD>This SQLINTEGER * record field points to a variable that will contain the total length in bytes of a dynamic argument (for parameter descriptors) or of a bound column value (for row descriptors).
+#
+# <P>For an APD, this value is ignored for all arguments except character string and binary; if this field points to SQL_NTS, the dynamic argument must be null-terminated. To indicate that a bound parameter will be a data-at-execution parameter, an application sets this field in the appropriate record of the APD to a variable that, at execute time, will contain the value SQL_DATA_AT_EXEC or the result of the SQL_LEN_DATA_AT_EXEC macro. If there is more than one such field, SQL_DESC_DATA_PTR can be set to a value uniquely identifying the parameter to help the application determine which parameter is being requested.
+#
+#
+# <P>If the OCTET_LENGTH_PTR field of an ARD is a null pointer, the driver does not return length information for the column. If the SQL_DESC_OCTET_LENGTH_PTR field of an APD is a null pointer, the driver assumes that character strings and binary values are null-terminated. (Binary values should not be null-terminated but should be given a length to avoid truncation.)
+#
+#
+# <P>If the call to <B>SQLFetch</B> or <B>SQLFetchScroll</B> that fills in the buffer pointed to by this field did not return SQL_SUCCESS or SQL_SUCCESS_WITH_INFO, the contents of the buffer are undefined. This field is a <I>deferred field</I>. It is not used at the time it is set but is used at a later time by the driver to determine or indicate the octet length of the data.
+# </dd>
+#
+# <DT><B>SQL_DESC_PARAMETER_TYPE [IPDs]</B></DT>
+#
+# <DD>This SQLSMALLINT record field is set to SQL_PARAM_INPUT for an input parameter, SQL_PARAM_INPUT_OUTPUT for an input/output parameter, or SQL_PARAM_OUTPUT for an output parameter. It is set to SQL_PARAM_INPUT by default.
+#
+# <P>For an IPD, the field is set to SQL_PARAM_INPUT by default if the IPD is not automatically populated by the driver (the SQL_ATTR_ENABLE_AUTO_IPD statement attribute is SQL_FALSE). An application should set this field in the IPD for parameters that are not input parameters.
+# </dd>
+#
+# <DT><B>SQL_DESC_PRECISION [All]</B></DT>
+#
+# <DD>This SQLSMALLINT record field contains the number of digits for an exact numeric type, the number of bits in the mantissa (binary precision) for an approximate numeric type, or the numbers of digits in the fractional seconds component for the SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP, or SQL_INTERVAL_SECOND data type. This field is undefined for all other data types.
+#
+# <P>The value in this field may be different from the value for "precision" as defined in ODBC 2<I>.x</I>. For more information, see <A HREF="odbcdata_types.htm">Appendix D: Data Types</A>.
+# </dd>
+#
+# <DT><B>SQL_DESC_ROWVER [Implementation descriptors]</B></DT>
+#
+# <DD>This SQLSMALLINT<B> </B>record field indicates whether a column is automatically modified by the DBMS when a row is updated (for example, a column of the type "timestamp" in SQL Server). The value of this record field is set to SQL_TRUE if the column is a row versioning column, and to SQL_FALSE otherwise. This column attribute is similar to calling <B>SQLSpecialColumns</B> with IdentifierType of SQL_ROWVER to determine whether a column is automatically updated.</dd>
+#
+# <DT><B>SQL_DESC_SCALE [All]</B></DT>
+#
+# <DD>This SQLSMALLINT record field contains the defined scale for decimal and numeric data types. The field is undefined for all other data types.
+#
+# <P>The value in this field may be different from the value for "scale" as defined in ODBC 2<I>.x</I>. For more information, see <A HREF="odbcdata_types.htm">Appendix D: Data Types</A>.
+# </dd>
+#
+# <DT><B>SQL_DESC_SCHEMA_NAME [IRDs]</B></DT>
+#
+# <DD>This read-only SQLCHAR * record field contains the schema name of the base table that contains the column. The return value is driver-dependent if the column is an expression or if the column is part of a view. If the data source does not support schemas or the schema name cannot be determined, this variable contains an empty string.</dd>
+#
+# <DT><B>SQL_DESC_SEARCHABLE [IRDs]</B></DT>
+#
+# <DD>This read-only SQLSMALLINT record field is set to one of the following values:
+#
+# <UL type=disc>
+# <LI>SQL_PRED_NONE if the column cannot be used in a <B>WHERE</B> clause. (This is the same as the SQL_UNSEARCHABLE value in ODBC 2<I>.x</I>.)</li>
+#
+# <LI>SQL_PRED_CHAR if the column can be used in a <B>WHERE</B> clause but only with the <B>LIKE</B> predicate. (This is the same as the SQL_LIKE_ONLY value in ODBC 2<I>.x</I>.)</li>
+#
+# <LI>SQL_PRED_BASIC if the column can be used in a <B>WHERE</B> clause with all the comparison operators except <B>LIKE</B>. (This is the same as the SQL_EXCEPT_LIKE value in ODBC 2<I>.x</I>.)</li>
+#
+# <LI>SQL_PRED_SEARCHABLE if the column can be used in a <B>WHERE</B> clause with any comparison operator.</li>
+# </UL>
+# </dd>
+#
+# <DT><B>SQL_DESC_TABLE_NAME [IRDs]</B></DT>
+#
+# <DD>This read-only SQLCHAR * record field contains the name of the base table that contains this column. The return value is driver-dependent if the column is an expression or if the column is part of a view.</dd>
+#
+# <DT><B>SQL_DESC_TYPE [All]</B></DT>
+#
+# <DD>This SQLSMALLINT record field specifies the concise SQL or C data type for all data types except datetime and interval data types. For the datetime and interval data types, this field specifies the verbose data type, which is SQL_DATETIME or SQL_INTERVAL.
+#
+# <P>Whenever this field contains SQL_DATETIME or SQL_INTERVAL, the SQL_DESC_DATETIME_INTERVAL_CODE field must contain the appropriate subcode for the concise type. For datetime data types, SQL_DESC_TYPE contains SQL_DATETIME, and the SQL_DESC_DATETIME_INTERVAL_CODE field contains a subcode for the specific datetime data type. For interval data types, SQL_DESC_TYPE contains SQL_INTERVAL and the SQL_DESC_DATETIME_INTERVAL_CODE field contains a subcode for the specific interval data type.
+#
+#
+# <P>The values in the SQL_DESC_TYPE and SQL_DESC_CONCISE_TYPE fields are interdependent. Each time one of the fields is set, the other must also be set. SQL_DESC_TYPE can be set by a call to <B>SQLSetDescField</B> or <B>SQLSetDescRec</B>. SQL_DESC_CONCISE_TYPE can be set by a call to <B>SQLBindCol</B> or <B>SQLBindParameter</B>, or <B>SQLSetDescField</B>.
+#
+#
+# <P>If SQL_DESC_TYPE is set to a concise data type other than an interval or datetime data type, the SQL_DESC_CONCISE_TYPE field is set to the same value and the SQL_DESC_DATETIME_INTERVAL_CODE field is set to 0.
+#
+#
+# <P>If SQL_DESC_TYPE is set to the verbose datetime or interval data type (SQL_DATETIME or SQL_INTERVAL) and the SQL_DESC_DATETIME_INTERVAL_CODE field is set to the appropriate subcode, the SQL_DESC_CONCISE TYPE field is set to the corresponding concise type. Trying to set SQL_DESC_TYPE to one of the concise datetime or interval types will return SQLSTATE HY021 (Inconsistent descriptor information).
+#
+#
+# <P>When the SQL_DESC_TYPE field is set by a call to <B>SQLBindCol</B>, <B>SQLBindParameter</B>, or <B>SQLSetDescField</B>, the following fields are set to the following default values, as shown in the table below. The values of the remaining fields of the same record are undefined.
+#
+# <!--TS:-->
+# <div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=48%>Value of SQL_DESC_TYPE</TH>
+# <TH width=52%>Other fields implicitly set</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>SQL_CHAR, SQL_VARCHAR, SQL_C_CHAR, SQL_C_VARCHAR</TD>
+# <TD width=52%>SQL_DESC_LENGTH is set to 1. SQL_DESC_PRECISION is set to 0.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>SQL_DATETIME</TD>
+# <TD width=52%>When SQL_DESC_DATETIME_INTERVAL_CODE is set to SQL_CODE_DATE or SQL_CODE_TIME, SQL_DESC_PRECISION is set to 0. When it is set to SQL_DESC_TIMESTAMP, SQL_DESC_PRECISION is set to 6.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>SQL_DECIMAL, SQL_NUMERIC,<BR>
+# SQL_C_NUMERIC</TD>
+# <TD width=52%>SQL_DESC_SCALE is set to 0. SQL_DESC_PRECISION is set to the implementation-defined precision for the respective data type.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>SQL_FLOAT, SQL_C_FLOAT</TD>
+# <TD width=52%>SQL_DESC_PRECISION is set to the implementation-defined default precision for SQL_FLOAT.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>SQL_INTERVAL</TD>
+# <TD width=52%>When SQL_DESC_DATETIME_INTERVAL_CODE is set to an interval data type, SQL_DESC_DATETIME_INTERVAL_PRECISION is set to 2 (the default interval leading precision). When the interval has a seconds component, SQL_DESC_PRECISION is set to 6 (the default interval seconds precision).</TD>
+# </TR>
+# </table></div>
+#
+# <!--TS:-->
+#
+# <P>When an application calls <B>SQLSetDescField</B> to set fields of a descriptor rather than calling <B>SQLSetDescRec</B>, the application must first declare the data type. When it does, the other fields indicated in the previous table are implicitly set. If any of the values implicitly set are unacceptable, the application can then call <B>SQLSetDescField</B> or <B>SQLSetDescRec</B> to set the unacceptable value explicitly.
+# </dd>
+#
+# <DT><B>SQL_DESC_TYPE_NAME [Implementation descriptors]</B></DT>
+#
+# <DD>This read-only SQLCHAR * record field contains the data source&#0150;dependent type name (for example, "CHAR", "VARCHAR", and so on). If the data type name is unknown, this variable contains an empty string.</dd>
+#
+# <DT><B>SQL_DESC_UNNAMED [Implementation descriptors]</B></DT>
+#
+# <DD>This SQLSMALLINT record field in a row descriptor is set by the driver to either SQL_NAMED or SQL_UNNAMED when it sets the SQL_DESC_NAME field. If the SQL_DESC_NAME field contains a column alias or if the column alias does not apply, the driver sets the SQL_DESC_UNNAMED field to SQL_NAMED. If an application sets the SQL_DESC_NAME field of an IPD to a parameter name or alias, the driver sets the SQL_DESC_UNNAMED field of the IPD to SQL_NAMED. If there is no column name or a column alias, the driver sets the SQL_DESC_UNNAMED field to SQL_UNNAMED.
+#
+# <P>An application can set the SQL_DESC_UNNAMED field of an IPD to SQL_UNNAMED. A driver returns SQLSTATE HY091 (Invalid descriptor field identifier) if an application attempts to set the SQL_DESC_UNNAMED field of an IPD to SQL_NAMED. The SQL_DESC_UNNAMED field of an IRD is read-only; SQLSTATE HY091 (Invalid descriptor field identifier) will be returned if an application attempts to set it.
+# </dd>
+#
+# <DT><B>SQL_DESC_UNSIGNED [Implementation descriptors]</B></DT>
+#
+# <DD>This read-only SQLSMALLINT record field is set to SQL_TRUE if the column type is unsigned or non-numeric, or SQL_FALSE if the column type is signed.</dd>
+#
+# <DT><B>SQL_DESC_UPDATABLE [IRDs]</B></DT>
+#
+# <DD>This read-only SQLSMALLINT record field is set to one of the following values:
+#
+# <UL type=disc>
+# <LI>SQL_ATTR_READ_ONLY if the result set column is read-only.</li>
+#
+# <LI>SQL_ATTR_WRITE if the result set column is read-write.</li>
+#
+# <LI>SQL_ATTR_READWRITE_UNKNOWN if it is not known whether the result set column is updatable or not.</li>
+# </UL>
+#
+#
+# <P>SQL_DESC_UPDATABLE describes the updatability of the column in the result set, not the column in the base table. The updatability of the column in the base table on which this result set column is based may be different than the value in this field. Whether a column is updatable can be based on the data type, user privileges, and the definition of the result set itself. If it is unclear whether a column is updatable, SQL_ATTR_READWRITE_UNKNOWN should be returned.
+# </dd>
+# </DL>
+#
+# <H1>Consistency Checks</H1>
+#
+# <P>A consistency check is performed by the driver automatically whenever an application passes in a value for the SQL_DESC_DATA_PTR field of the ARD, APD, or IPD. If any of the fields is inconsistent with other fields, <B>SQLSetDescField</B> will return SQLSTATE HY021 (Inconsistent descriptor information). For more information, see "Consistency Check" in <A HREF="odbcsqlsetdescrec.htm">SQLSetDescRec</A>.</P>
+#
+# <P class="label"><B>Related Functions</B></P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=48%>For information about</TH>
+# <TH width=52%>See</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>Binding a column</TD>
+# <TD width=52%><A HREF="odbcsqlbindcol.htm">SQLBindCol</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>Binding a parameter</TD>
+# <TD width=52%><A HREF="odbcsqlbindparameter.htm">SQLBindParameter</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>Getting a descriptor field</TD>
+# <TD width=52%><A HREF="odbcsqlgetdescfield.htm">SQLGetDescField</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>Getting multiple descriptor fields</TD>
+# <TD width=52%><A HREF="odbcsqlgetdescrec.htm">SQLGetDescRec</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>Setting multiple descriptor fields</TD>
+# <TD width=52%><A HREF="odbcsqlsetdescrec.htm">SQLSetDescRec</A></TD>
+# </TR>
+# </table></div>
+# <!--TS:--><H4><A NAME="feedback"></A></H4>
+# <SPAN id="SDKFeedB"></SPAN>
+# </div>
+#
+# </BODY>
+# </HTML>
+};
diff --git a/storage/ndb/src/old_files/client/odbc/docs/diag.txt b/storage/ndb/src/old_files/client/odbc/docs/diag.txt
new file mode 100644
index 00000000000..a9a0e0f42d0
--- /dev/null
+++ b/storage/ndb/src/old_files/client/odbc/docs/diag.txt
@@ -0,0 +1,48 @@
+# Header Fields
+
+SQL_DIAG_CURSOR_ROW_COUNT
+SQLINTEGER
+
+SQL_DIAG_DYNAMIC_FUNCTION
+SQLCHAR *
+
+SQL_DIAG_DYNAMIC_FUNCTION_CODE
+SQLINTEGER
+
+SQL_DIAG_NUMBER
+SQLINTEGER
+
+SQL_DIAG_RETURNCODE
+SQLRETURN
+
+SQL_DIAG_ROW_COUNT
+SQLINTEGER
+
+# Record Fields
+
+SQL_DIAG_CLASS_ORIGIN
+SQLCHAR *
+
+SQL_DIAG_COLUMN_NUMBER
+SQLINTEGER
+
+SQL_DIAG_CONNECTION_NAME
+SQLCHAR *
+
+SQL_DIAG_MESSAGE_TEXT
+SQLCHAR *
+
+SQL_DIAG_NATIVE
+SQLINTEGER
+
+SQL_DIAG_ROW_NUMBER
+SQLINTEGER
+
+SQL_DIAG_SERVER_NAME
+SQLCHAR *
+
+SQL_DIAG_SQLSTATE
+SQLCHAR *
+
+SQL_DIAG_SUBCLASS_ORIGIN
+SQLCHAR *
diff --git a/storage/ndb/src/old_files/client/odbc/docs/getinfo.pl b/storage/ndb/src/old_files/client/odbc/docs/getinfo.pl
new file mode 100644
index 00000000000..34e26b47bab
--- /dev/null
+++ b/storage/ndb/src/old_files/client/odbc/docs/getinfo.pl
@@ -0,0 +1,3676 @@
+#
+use strict;
+
+#
+# odbcsqlgetinfo.htm
+#
+my $info = {
+# <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+# <HTML DIR="LTR"><HEAD>
+# <META HTTP-EQUIV="Content-Type" Content="text/html; charset=Windows-1252">
+# <TITLE>SQLGetInfo</TITLE>
+# <SCRIPT SRC="/stylesheets/vs70link.js"></SCRIPT>
+# <SCRIPT SRC="/stylesheets/vs70.js"></SCRIPT>
+# <SCRIPT LANGUAGE="JScript" SRC="/stylesheets/odbc.js"></SCRIPT>
+# </HEAD>
+# <body topmargin=0 id="bodyID">
+#
+# <div id="nsbanner">
+# <div id="bannertitle">
+# <TABLE CLASS="bannerparthead" CELLSPACING=0>
+# <TR ID="hdr">
+# <TD CLASS="bannertitle" nowrap>
+# ODBC Programmer's Reference
+# </TD><TD valign=middle><a href="#Feedback"><IMG name="feedb" onclick=EMailStream(SDKFeedB) style="CURSOR: hand;" hspace=15 alt="" src="/stylesheets/mailto.gif" align=right></a></TD>
+# </TR>
+# </TABLE>
+# </div>
+# </div>
+# <DIV id="nstext" valign="bottom">
+#
+# <H1><A NAME="odbcsqlgetinfo"></A>SQLGetInfo</H1>
+#
+# <P class="label"><B>Conformance</B></P>
+#
+# <P>Version Introduced: ODBC 1.0<BR>
+# Standards Compliance: ISO 92</P>
+#
+# <P class="label"><B>Summary</B></P>
+#
+# <P><B>SQLGetInfo</B> returns general information about the driver and data source associated with a connection.</P>
+#
+# <P class="label"><B>Syntax</B></P>
+#
+# <PRE class="syntax">SQLRETURN <B>SQLGetInfo</B>(
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLHDBC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>ConnectionHandle</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLUSMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>InfoType</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLPOINTER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>InfoValuePtr</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLSMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>BufferLength</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLSMALLINT *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>StringLengthPtr</I>);</PRE>
+#
+# <P class="label"><B>Arguments</B>
+#
+# <DL>
+# <DT><I>ConnectionHandle</I></DT>
+#
+# <DD>[Input]<BR>
+# Connection handle.</dd>
+#
+# <DT><I>InfoType</I></DT>
+#
+# <DD>[Input]<BR>
+# Type of information.</dd>
+#
+# <DT><I>InfoValuePtr</I></DT>
+#
+# <DD>[Output]<BR>
+# Pointer to a buffer in which to return the information. Depending on the <I>InfoType</I> requested, the information returned will be one of the following: a null-terminated character string, an SQLUSMALLINT value, an SQLUINTEGER bitmask, an SQLUINTEGER flag, or a SQLUINTEGER binary value.
+#
+# <P>If the <I>InfoType</I> argument is SQL_DRIVER_HDESC or SQL_DRIVER_HSTMT, the <I>InfoValuePtr</I> argument is both input and output. (See the SQL_DRIVER_HDESC or SQL_DRIVER_HSTMT descriptors later in this function description for more information.)
+# </dd>
+#
+# <DT><I>BufferLength</I></DT>
+#
+# <DD>[Input]<BR>
+# Length of the *<I>InfoValuePtr</I> buffer. If the value in <I>*InfoValuePtr</I> is not a character string or if <I>InfoValuePtr</I> is a null pointer,<I> </I>the <I>BufferLength</I> argument is ignored. The driver assumes that the size of <I>*InfoValuePtr</I> is SQLUSMALLINT or SQLUINTEGER, based on the <I>InfoType</I>. If <I>*InfoValuePtr</I> is a Unicode string (when calling <B>SQLGetInfoW</B>), the <I>BufferLength</I> argument must be an even number; if not, SQLSTATE HY090 (Invalid string or buffer length) is returned. </dd>
+#
+# <DT><I>StringLengthPtr</I></DT>
+#
+# <DD>[Output]<BR>
+# Pointer to a buffer in which to return the total number of bytes (excluding the null-termination character for character data) available to return in *<I>InfoValuePtr</I>.
+#
+# <P>For character data, if the number of bytes available to return is greater than or equal to <I>BufferLength</I>, the information in *<I>InfoValuePtr</I> is truncated to <I>BufferLength</I> bytes minus the length of a null-termination character and is null-terminated by the driver.
+#
+#
+# <P>For all other types of data, the value of <I>BufferLength</I> is ignored and the driver assumes the size of *<I>InfoValuePtr</I> is SQLUSMALLINT or SQLUINTEGER, depending on the <I>InfoType</I>.
+# </dd>
+# </DL>
+#
+# <P class="label"><B>Returns</B></P>
+#
+# <P>SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or SQL_INVALID_HANDLE.</P>
+#
+# <P class="label"><B>Diagnostics</B></P>
+#
+# <P>When <B>SQLGetInfo</B> returns either SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value can be obtained by calling <B>SQLGetDiagRec</B> with a <I>HandleType</I> of SQL_HANDLE_DBC and a <I>Handle</I> of <I>ConnectionHandle</I>. The following table lists the SQLSTATE values commonly returned by <B>SQLGetInfo</B> and explains each one in the context of this function; the notation "(DM)" precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=23%>SQLSTATE</TH>
+# <TH width=26%>Error</TH>
+# <TH width=51%>Description</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=23%>01000</TD>
+# <TD width=26%>General warning</TD>
+# <TD width=51%>Driver-specific informational message. (Function returns SQL_SUCCESS_WITH_INFO.)</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=23%>01004</TD>
+# <TD width=26%>String data, right truncated</TD>
+# <TD width=51%>The buffer *<I>InfoValuePtr</I> was not large enough to return all of the requested information, so the information was truncated. The length of the requested information in its untruncated form is returned in *<I>StringLengthPtr</I>. (Function returns SQL_SUCCESS_WITH_INFO.)</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=23%>08003</TD>
+# <TD width=26%>Connection does not exist</TD>
+# <TD width=51%>(DM) The type of information requested in <I>InfoType</I> requires an open connection. Of the information types reserved by ODBC, only SQL_ODBC_VER can be returned without an open connection.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=23%>08S01</TD>
+# <TD width=26%>Communication link failure</TD>
+# <TD width=51%>The communication link between the driver and the data source to which the driver was connected failed before the function completed processing.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=23%>HY000</TD>
+# <TD width=26%>General error</TD>
+# <TD width=51%>An error occurred for which there was no specific SQLSTATE and for which no implementation-specific SQLSTATE was defined. The error message returned by <B>SQLGetDiagRec</B> in the <I>*MessageText</I> buffer describes the error and its cause.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=23%>HY001</TD>
+# <TD width=26%>Memory allocation <BR>
+# error</TD>
+# <TD width=51%>The driver was unable to allocate memory required to support execution or completion of the function.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=23%>HY013</TD>
+# <TD width=26%>Memory management error</TD>
+# <TD width=51%>The function call could not be processed because the underlying memory objects could not be accessed, possibly because of low memory conditions.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=23%>HY024</TD>
+# <TD width=26%>Invalid attribute value</TD>
+# <TD width=51%>(DM) The <I>InfoType</I> argument was SQL_DRIVER_HSTMT, and the value pointed to by <I>InfoValuePtr</I> was not a valid statement handle.
+# <P>(DM) The <I>InfoType</I> argument was SQL_DRIVER_HDESC, and the value pointed to by <I>InfoValuePtr</I> was not a valid descriptor handle.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=23%>HY090</TD>
+# <TD width=26%>Invalid string or buffer length</TD>
+# <TD width=51%>(DM) The value specified for argument <I>BufferLength</I> was less than 0.
+# <P>(DM) The value specified for <I>BufferLength</I> was an odd number, and <I>*InfoValuePtr </I>was of a Unicode data type.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=23%>HY096</TD>
+# <TD width=26%>Information type out of range</TD>
+# <TD width=51%>The value specified for the argument <I>InfoType</I> was not valid for the version of ODBC supported by the driver.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=23%>HYC00</TD>
+# <TD width=26%>Optional field not implemented</TD>
+# <TD width=51%>The value specified for the argument <I>InfoType</I> was a driver-specific value that is not supported by the driver.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=23%>HYT01</TD>
+# <TD width=26%>Connection timeout expired</TD>
+# <TD width=51%>The connection timeout period expired before the data source responded to the request. The connection timeout period is set through <B>SQLSetConnectAttr</B>, SQL_ATTR_CONNECTION_TIMEOUT.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=23%>IM001</TD>
+# <TD width=26%>Driver does not support this function</TD>
+# <TD width=51%>(DM) The driver corresponding to the <I>ConnectionHandle</I> does not support the function.</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Comments</B></P>
+#
+# <P>The currently defined information types are shown in "Information Types," later in this section; it is expected that more will be defined to take advantage of different data sources. A range of information types is reserved by ODBC; driver developers must reserve values for their own driver-specific use from X/Open. <B>SQLGetInfo</B> performs no Unicode conversion or <I>thunking</I> (see <A HREF="odbcodbc_error_codes.htm">Appendix A</A> of the <I>ODBC Programmer's Reference</I>) for driver-defined <I>InfoTypes</I>. For more information, see "<A HREF="odbcdriver_specific_data_types__descriptor_types__information_types.htm">Driver-Specific Data Types, Descriptor Types, Information Types, Diagnostic Types, and Attributes</A>" in Chapter 17: Programming Considerations. The format of the information returned in *<I>InfoValuePtr</I> depends on the <I>InfoType</I> requested. <B>SQLGetInfo</B> will return information in one of five different formats:
+#
+# <UL type=disc>
+# <LI>A null-terminated character string</li>
+#
+# <LI>An SQLUSMALLINT value</li>
+#
+# <LI>An SQLUINTEGER bitmask</li>
+#
+# <LI>An SQLUINTEGER value</li>
+#
+# <LI>A SQLUINTEGER binary value</li>
+# </UL>
+#
+# <P>The format of each of the following information types is noted in the type's description. The application must cast the value returned in *<I>InfoValuePtr</I> accordingly. For an example of how an application could retrieve data from a SQLUINTEGER bitmask, see "Code Example."</P>
+#
+# <P>A driver must return a value for each of the information types defined in the tables below. If an information type does not apply to the driver or data source, the driver returns one of the values listed in the following table.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=49%>Format of *<I>InfoValuePtr</I></TH>
+# <TH width=51%>Returned value</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>Character string ("Y" or "N")</TD>
+# <TD width=51%>"N"</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>Character string (not "Y" or "N")</TD>
+# <TD width=51%>Empty string</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQLUSMALLINT</TD>
+# <TD width=51%>0</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQLUINTEGER bitmask or SQLUINTEGER binary value</TD>
+# <TD width=51%>0L</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P>For example, if a data source does not support procedures, <B>SQLGetInfo</B> returns the values listed in the following table for the values of <I>InfoType</I> that are related to procedures.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=49%><I>InfoType</I></TH>
+# <TH width=51%>Returned value</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_PROCEDURES</TD>
+# <TD width=51%>"N"</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_ACCESSIBLE_PROCEDURES</TD>
+# <TD width=51%>"N"</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_MAX_PROCEDURE_NAME_LEN</TD>
+# <TD width=51%>0</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_PROCEDURE_TERM</TD>
+# <TD width=51%>Empty string</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P><B>SQLGetInfo</B> returns SQLSTATE HY096 (Invalid argument value) for values of <I>InfoType</I> that are in the range of information types reserved for use by ODBC but are not defined by the version of ODBC supported by the driver. To determine what version of ODBC a driver conforms to, an application calls <B>SQLGetInfo</B> with the SQL_DRIVER_ODBC_VER information type. <B>SQLGetInfo</B> returns SQLSTATE HYC00 (Optional feature not implemented) for values of <I>InfoType</I> that are in the range of information types reserved for driver-specific use but are not supported by the driver.</P>
+#
+# <P>All calls to <B>SQLGetInfo</B> require an open connection, except when the <I>InfoType</I> is SQL_ODBC_VER, which returns the version of the Driver Manager.</P>
+#
+# <H1>Information Types</H1>
+#
+# <P>This section lists the information types supported by <B>SQLGetInfo</B>. Information types are grouped categorically and listed alphabetically. Information types that were added or renamed for ODBC 3<I>.x</I> are also listed.</P>
+#
+# <H2>Driver Information</H2>
+#
+# <P>The following values of the <I>InfoType</I> argument return information about the ODBC driver, such as the number of active statements, the data source name, and the interface standards compliance level:</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TD width=43%>SQL_ACTIVE_ENVIRONMENTS</TD>
+# <TD width=57%>SQL_GETDATA_EXTENSIONS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>SQL_ASYNC_MODE</TD>
+# <TD width=57%>SQL_INFO_SCHEMA_VIEWS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>SQL_BATCH_ROW_COUNT</TD>
+# <TD width=57%>SQL_KEYSET_CURSOR_ATTRIBUTES1</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>SQL_BATCH_SUPPORT</TD>
+# <TD width=57%>SQL_KEYSET_CURSOR_ATTRIBUTES2</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>SQL_DATA_SOURCE_NAME</TD>
+# <TD width=57%>SQL_MAX_ASYNC_CONCURRENT_STATEMENTS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>SQL_DRIVER_HDBC</TD>
+# <TD width=57%>SQL_MAX_CONCURRENT_ACTIVITIES</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>SQL_DRIVER_HDESC</TD>
+# <TD width=57%>SQL_MAX_DRIVER_CONNECTIONS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>SQL_DRIVER_HENV</TD>
+# <TD width=57%>SQL_ODBC_INTERFACE_CONFORMANCE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>SQL_DRIVER_HLIB</TD>
+# <TD width=57%>SQL_ODBC_STANDARD_CLI_CONFORMANCE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>SQL_DRIVER_HSTMT</TD>
+# <TD width=57%>SQL_ODBC_VER</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>SQL_DRIVER_NAME</TD>
+# <TD width=57%>SQL_PARAM_ARRAY_ROW_COUNTS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>SQL_DRIVER_ODBC_VER</TD>
+# <TD width=57%>SQL_PARAM_ARRAY_SELECTS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>SQL_DRIVER_VER</TD>
+# <TD width=57%>SQL_ROW_UPDATES</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>SQL_DYNAMIC_CURSOR_ATTRIBUTES1</TD>
+# <TD width=57%>SQL_SEARCH_PATTERN_ESCAPE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>SQL_DYNAMIC_CURSOR_ATTRIBUTES2</TD>
+# <TD width=57%>SQL_SERVER_NAME</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1</TD>
+# <TD width=57%>SQL_STATIC_CURSOR_ATTRIBUTES1</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2</TD>
+# <TD width=57%>SQL_STATIC_CURSOR_ATTRIBUTES2</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>SQL_FILE_USAGE</TD>
+# <TD width=57%>&nbsp;</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <H2>DBMS Product Information</H2>
+#
+# <P>The following values of the <I>InfoType</I> argument return information about the DBMS product, such as the DBMS name and version:</P>
+#
+# <P>SQL_DATABASE_NAME<BR>
+# SQL_DBMS_NAME<BR>
+# SQL_DBMS_VER</P>
+#
+# <H2>Data Source Information</H2>
+#
+# <P>The following values of the <I>InfoType</I> argument return information about the data source, such as cursor characteristics and transaction capabilities:</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TD width=54%>SQL_ACCESSIBLE_PROCEDURES</TD>
+# <TD width=46%>SQL_MULT_RESULT_SETS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=54%>SQL_ACCESSIBLE_TABLES</TD>
+# <TD width=46%>SQL_MULTIPLE_ACTIVE_TXN</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=54%>SQL_BOOKMARK_PERSISTENCE</TD>
+# <TD width=46%>SQL_NEED_LONG_DATA_LEN</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=54%>SQL_CATALOG_TERM</TD>
+# <TD width=46%>SQL_NULL_COLLATION</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=54%>SQL_COLLATION_SEQ</TD>
+# <TD width=46%>SQL_PROCEDURE_TERM</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=54%>SQL_CONCAT_NULL_BEHAVIOR</TD>
+# <TD width=46%>SQL_SCHEMA_TERM</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=54%>SQL_CURSOR_COMMIT_BEHAVIOR</TD>
+# <TD width=46%>SQL_SCROLL_OPTIONS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=54%>SQL_CURSOR_ROLLBACK_BEHAVIOR</TD>
+# <TD width=46%>SQL_TABLE_TERM</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=54%>SQL_CURSOR_SENSITIVITY</TD>
+# <TD width=46%>SQL_TXN_CAPABLE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=54%>SQL_DATA_SOURCE_READ_ONLY</TD>
+# <TD width=46%>SQL_TXN_ISOLATION_OPTION</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=54%>SQL_DEFAULT_TXN_ISOLATION</TD>
+# <TD width=46%>SQL_USER_NAME</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=54%>SQL_DESCRIBE_PARAMETER</TD>
+# <TD width=46%>&nbsp;</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <H2>Supported SQL</H2>
+#
+# <P>The following values of the <I>InfoType</I> argument return information about the SQL statements supported by the data source. The SQL syntax of each feature described by these information types is the SQL-92 syntax. These information types do not exhaustively describe the entire SQL-92 grammar. Instead, they describe those parts of the grammar for which data sources commonly offer different levels of support. Specifically, most of the DDL statements in SQL-92 are covered.</P>
+#
+# <P>Applications should determine the general level of supported grammar from the SQL_SQL_CONFORMANCE information type and use the other information types to determine variations from the stated standards compliance level.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_AGGREGATE_FUNCTIONS</TD>
+# <TD width=51%>SQL_DROP_TABLE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_ALTER_DOMAIN</TD>
+# <TD width=51%>SQL_DROP_TRANSLATION</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_ALTER_SCHEMA</TD>
+# <TD width=51%>SQL_DROP_VIEW</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_ALTER_TABLE</TD>
+# <TD width=51%>SQL_EXPRESSIONS_IN_ORDERBY</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_ANSI_SQL_DATETIME_LITERALS</TD>
+# <TD width=51%>SQL_GROUP_BY</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CATALOG_LOCATION </TD>
+# <TD width=51%>SQL_IDENTIFIER_CASE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CATALOG_NAME</TD>
+# <TD width=51%>SQL_IDENTIFIER_QUOTE_CHAR</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CATALOG_NAME_SEPARATOR</TD>
+# <TD width=51%>SQL_INDEX_KEYWORDS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CATALOG_USAGE</TD>
+# <TD width=51%>SQL_INSERT_STATEMENT</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_COLUMN_ALIAS</TD>
+# <TD width=51%>SQL_INTEGRITY</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CORRELATION_NAME</TD>
+# <TD width=51%>SQL_KEYWORDS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CREATE_ASSERTION</TD>
+# <TD width=51%>SQL_LIKE_ESCAPE_CLAUSE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CREATE_CHARACTER_SET</TD>
+# <TD width=51%>SQL_NON_NULLABLE_COLUMNS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CREATE_COLLATION</TD>
+# <TD width=51%>SQL_SQL_CONFORMANCE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CREATE_DOMAIN</TD>
+# <TD width=51%>SQL_OJ_CAPABILITIES</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CREATE_SCHEMA</TD>
+# <TD width=51%>SQL_ORDER_BY_COLUMNS_IN_SELECT</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CREATE_TABLE</TD>
+# <TD width=51%>SQL_OUTER_JOINS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CREATE_TRANSLATION</TD>
+# <TD width=51%>SQL_PROCEDURES</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_DDL_INDEX</TD>
+# <TD width=51%>SQL_QUOTED_IDENTIFIER_CASE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_DROP_ASSERTION</TD>
+# <TD width=51%>SQL_SCHEMA_USAGE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_DROP_CHARACTER_SET</TD>
+# <TD width=51%>SQL_SPECIAL_CHARACTERS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_DROP_COLLATION</TD>
+# <TD width=51%>SQL_SUBQUERIES</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_DROP_DOMAIN</TD>
+# <TD width=51%>SQL_UNION</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_DROP_SCHEMA</TD>
+# <TD width=51%>&nbsp;</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>SQL Limits</B></P>
+#
+# <P>The following values of the <I>InfoType</I> argument return information about the limits applied to identifiers and clauses in SQL statements, such as the maximum lengths of identifiers and the maximum number of columns in a select list. Limitations can be imposed by either the driver or the data source.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_MAX_BINARY_LITERAL_LEN</TD>
+# <TD width=51%>SQL_MAX_IDENTIFIER_LEN</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_MAX_CATALOG_NAME_LEN</TD>
+# <TD width=51%>SQL_MAX_INDEX_SIZE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_MAX_CHAR_LITERAL_LEN</TD>
+# <TD width=51%>SQL_MAX_PROCEDURE_NAME_LEN</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_MAX_COLUMN_NAME_LEN</TD>
+# <TD width=51%>SQL_MAX_ROW_SIZE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_MAX_COLUMNS_IN_GROUP_BY</TD>
+# <TD width=51%>SQL_MAX_ROW_SIZE_INCLUDES_LONG</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_MAX_COLUMNS_IN_INDEX</TD>
+# <TD width=51%>SQL_MAX_SCHEMA_NAME_LEN</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_MAX_COLUMNS_IN_ORDER_BY</TD>
+# <TD width=51%>SQL_MAX_STATEMENT_LEN</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_MAX_COLUMNS_IN_SELECT</TD>
+# <TD width=51%>SQL_MAX_TABLE_NAME_LEN</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_MAX_COLUMNS_IN_TABLE</TD>
+# <TD width=51%>SQL_MAX_TABLES_IN_SELECT</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_MAX_CURSOR_NAME_LEN</TD>
+# <TD width=51%>SQL_MAX_USER_NAME_LEN</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Scalar Function Information</B></P>
+#
+# <P>The following values of the <I>InfoType</I> argument return information about the scalar functions supported by the data source and the driver. For more information about scalar functions, see <A HREF="odbcscalar_functions.htm">Appendix E: Scalar Functions</A>.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CONVERT_FUNCTIONS</TD>
+# <TD width=51%>SQL_TIMEDATE_ADD_INTERVALS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_NUMERIC_FUNCTIONS</TD>
+# <TD width=51%>SQL_TIMEDATE_DIFF_INTERVALS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_STRING_FUNCTIONS</TD>
+# <TD width=51%>SQL_TIMEDATE_FUNCTIONS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_SYSTEM_FUNCTIONS</TD>
+# <TD width=51%>&nbsp;</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Conversion Information</B></P>
+#
+# <P>The following values of the <I>InfoType</I> argument return a list of the SQL data types to which the data source can convert the specified SQL data type with the <B>CONVERT</B> scalar function:</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TD width=53%>SQL_CONVERT_BIGINT</TD>
+# <TD width=47%>SQL_CONVERT_LONGVARBINARY</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=53%>SQL_CONVERT_BINARY</TD>
+# <TD width=47%>SQL_CONVERT_LONGVARCHAR</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=53%>SQL_CONVERT_BIT</TD>
+# <TD width=47%>SQL_CONVERT_NUMERIC</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=53%>SQL_CONVERT_CHAR</TD>
+# <TD width=47%>SQL_CONVERT_REAL</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=53%>SQL_CONVERT_DATE</TD>
+# <TD width=47%>SQL_CONVERT_SMALLINT</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=53%>SQL_CONVERT_DECIMAL</TD>
+# <TD width=47%>SQL_CONVERT_TIME</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=53%>SQL_CONVERT_DOUBLE</TD>
+# <TD width=47%>SQL_CONVERT_TIMESTAMP</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=53%>SQL_CONVERT_FLOAT</TD>
+# <TD width=47%>SQL_CONVERT_TINYINT</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=53%>SQL_CONVERT_INTEGER</TD>
+# <TD width=47%>SQL_CONVERT_VARBINARY</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=53%>SQL_CONVERT_INTERVAL_YEAR_MONTH</TD>
+# <TD width=47%>SQL_CONVERT_VARCHAR</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=53%>SQL_CONVERT_INTERVAL_DAY_TIME</TD>
+# <TD width=47%>&nbsp;</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Information Types Added for ODBC 3<I>.x</I></B></P>
+#
+# <P>The following values of the <I>InfoType</I> argument have been added for ODBC 3<I>.x</I>:</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_ACTIVE_ENVIRONMENTS</TD>
+# <TD width=51%>SQL_DROP_ASSERTION</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_AGGREGATE_FUNCTIONS</TD>
+# <TD width=51%>SQL_DROP_CHARACTER_SET</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_ALTER_DOMAIN</TD>
+# <TD width=51%>SQL_DROP_COLLATION</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_ALTER_SCHEMA</TD>
+# <TD width=51%>SQL_DROP_DOMAIN</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_ANSI_SQL_DATETIME_LITERALS</TD>
+# <TD width=51%>SQL_DROP_SCHEMA</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_ASYNC_MODE</TD>
+# <TD width=51%>SQL_DROP_TABLE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_BATCH_ROW_COUNT</TD>
+# <TD width=51%>SQL_DROP_TRANSLATION</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_BATCH_SUPPORT</TD>
+# <TD width=51%>SQL_DROP_VIEW</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CATALOG_NAME</TD>
+# <TD width=51%>SQL_DYNAMIC_CURSOR_ATTRIBUTES1</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_COLLATION_SEQ</TD>
+# <TD width=51%>SQL_DYNAMIC_CURSOR_ATTRIBUTES2</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CONVERT_INTERVAL_YEAR_MONTH</TD>
+# <TD width=51%>SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CONVERT_INTERVAL_DAY_TIME</TD>
+# <TD width=51%>SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CREATE_ASSERTION</TD>
+# <TD width=51%>SQL_INFO_SCHEMA_VIEWS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CREATE_CHARACTER_SET</TD>
+# <TD width=51%>SQL_INSERT_STATEMENT</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CREATE_COLLATION</TD>
+# <TD width=51%>SQL_KEYSET_CURSOR_ATTRIBUTES1</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CREATE_DOMAIN</TD>
+# <TD width=51%>SQL_KEYSET_CURSOR_ATTRIBUTES2</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CREATE_SCHEMA</TD>
+# <TD width=51%>SQL_MAX_ASYNC_CONCURRENT_STATEMENTS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CREATE_TABLE</TD>
+# <TD width=51%>SQL_MAX_IDENTIFIER_LEN</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CREATE_TRANSLATION</TD>
+# <TD width=51%>SQL_PARAM_ARRAY_ROW_COUNTS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_CURSOR_SENSITIVITY</TD>
+# <TD width=51%>SQL_PARAM_ARRAY_SELECTS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_DDL_INDEX</TD>
+# <TD width=51%>SQL_STATIC_CURSOR_ATTRIBUTES1</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_DESCRIBE_PARAMETER</TD>
+# <TD width=51%>SQL_STATIC_CURSOR_ATTRIBUTES2</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_DM_VER</TD>
+# <TD width=51%>SQL_XOPEN_CLI_YEAR</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=49%>SQL_DRIVER_HDESC</TD>
+# <TD width=51%>&nbsp;</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Information Types Renamed for ODBC 3<I>.x</I></B></P>
+#
+# <P>The following values of the <I>InfoType</I> argument have been renamed for ODBC 3<I>.x</I>.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=55%>ODBC 2.0 <I>InfoType</I></TH>
+# <TH width=45%>ODBC 3<I>.x</I> <I>InfoType</I></TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=55%>SQL_ACTIVE_CONNECTIONS</TD>
+# <TD width=45%>SQL_MAX_DRIVER_CONNECTIONS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=55%>SQL_ACTIVE_STATEMENTS</TD>
+# <TD width=45%>SQL_MAX_CONCURRENT_ACTIVITIES</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=55%>SQL_MAX_OWNER_NAME_LEN</TD>
+# <TD width=45%>SQL_MAX_SCHEMA_NAME_LEN</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=55%>SQL_MAX_QUALIFIER_NAME_LEN</TD>
+# <TD width=45%>SQL_MAX_CATALOG_NAME_LEN</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=55%>SQL_ODBC_SQL_OPT_IEF</TD>
+# <TD width=45%>SQL_INTEGRITY</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=55%>SQL_OWNER_TERM</TD>
+# <TD width=45%>SQL_SCHEMA_TERM</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=55%>SQL_OWNER_USAGE</TD>
+# <TD width=45%>SQL_SCHEMA_USAGE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=55%>SQL_QUALIFIER_LOCATION</TD>
+# <TD width=45%>SQL_CATALOG_LOCATION</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=55%>SQL_QUALIFIER_NAME_SEPARATOR</TD>
+# <TD width=45%>SQL_CATALOG_NAME_SEPARATOR</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=55%>SQL_QUALIFIER_TERM</TD>
+# <TD width=45%>SQL_CATALOG_TERM</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=55%>SQL_QUALIFIER_USAGE</TD>
+# <TD width=45%>SQL_CATALOG_USAGE</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Information Types Deprecated in ODBC 3<I>.x</I></B></P>
+#
+# <P>The following values of the <I>InfoType</I> argument have been deprecated in ODBC 3<I>.x</I>. ODBC 3<I>.x</I> drivers must continue to support these information types for backward compatibility with ODBC 2<I>.x</I> applications. (For more information on these types, see "<A HREF="odbcsqlgetinfo_support.htm">SQLGetInfo Support</A>" in Appendix G: Driver Guidelines for Backward Compatibility.)</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TD width=51%>SQL_FETCH_DIRECTION</TD>
+# <TD width=49%>SQL_POS_OPERATIONS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=51%>SQL_LOCK_TYPES</TD>
+# <TD width=49%>SQL_POSITIONED_STATEMENTS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=51%>SQL_ODBC_API_CONFORMANCE</TD>
+# <TD width=49%>SQL_SCROLL_CONCURRENCY</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=51%>SQL_ODBC_SQL_CONFORMANCE</TD>
+# <TD width=49%>SQL_STATIC_SENSITIVITY</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <H2>Information Type Descriptions</H2>
+#
+# <P>The following table alphabetically lists each information type, the version of ODBC in which it was introduced, and its description.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=50%><I>InfoType</I></TH>
+# <TH width=50%>Returns</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ACCESSIBLE_PROCEDURES<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string: "Y" if the user can execute all procedures returned by <B>SQLProcedures</B>; "N" if there may be procedures returned that the user cannot execute.</TD>
+# </TR>
+ SQL_ACCESSIBLE_PROCEDURES => {
+ type => q(YesNo),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ACCESSIBLE_TABLES<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string: "Y" if the user is guaranteed <B>SELECT</B> privileges to all tables returned by <B>SQLTables</B>; "N" if there may be tables returned that the user cannot access.</TD>
+# </TR>
+ SQL_ACCESSIBLE_TABLES => {
+ type => q(YesNo),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ACTIVE_ENVIRONMENTS<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying the maximum number of active environments that the driver can support. If there is no specified limit or the limit is unknown, this value is set to zero.</TD>
+# </TR>
+ SQL_ACTIVE_ENVIRONMENTS => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_AGGREGATE_FUNCTIONS<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating support for aggregation functions:
+# <P>SQL_AF_ALL<BR>
+# SQL_AF_AVG<BR>
+# SQL_AF_COUNT<BR>
+# SQL_AF_DISTINCT<BR>
+# SQL_AF_MAX<BR>
+# SQL_AF_MIN<BR>
+# SQL_AF_SUM </P>
+#
+# <P>An SQL-92 Entry level&#0150;conformant driver will always return all of these options as supported.</P>
+# </TD>
+# </TR>
+ SQL_AGGREGATE_FUNCTIONS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ALTER_DOMAIN<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses in the <B>ALTER DOMAIN</B> statement, as defined in SQL-92, supported by the data source. An SQL-92 Full level&#0150;compliant driver will always return all of the bitmasks. A return value of "0" means that the <B>ALTER DOMAIN</B> statement is not supported.
+# <P>The SQL-92 or FIPS conformance level at which this feature needs to be supported is shown in parentheses next to each bitmask.</P>
+#
+# <P>The following bitmasks are used to determine which clauses are supported:</P>
+#
+# <P>SQL_AD_ADD_DOMAIN_CONSTRAINT = Adding a domain constraint is supported (Full level)</P>
+#
+# <P>SQL_AD_ADD_DOMAIN_DEFAULT = &lt;alter domain&gt; &lt;set domain default clause&gt; is supported (Full level)</P>
+#
+# <P>SQL_AD_CONSTRAINT_NAME_DEFINITION = &lt;constraint name definition clause&gt; is supported for naming domain constraint (Intermediate level)</P>
+#
+# <P>SQL_AD_DROP_DOMAIN_CONSTRAINT = &lt;drop domain constraint clause&gt; is supported (Full level)</P>
+#
+# <P>SQL_AD_DROP_DOMAIN_DEFAULT = &lt;alter domain&gt; &lt;drop domain default clause&gt; is supported (Full level)</P>
+#
+# <P>The following bits specify the supported &lt;constraint attributes&gt; if &lt;add domain constraint&gt; is supported (the SQL_AD_ADD_DOMAIN_CONSTRAINT bit is set):</P>
+#
+# <P>SQL_AD_ADD_CONSTRAINT_DEFERRABLE (Full level)<BR>
+# SQL_AD_ADD_CONSTRAINT_NON_DEFERRABLE (Full level)<BR>
+# SQL_AD_ADD_CONSTRAINT_INITIALLY_DEFERRED (Full level)<BR>
+# SQL_AD_ADD_CONSTRAINT_INITIALLY_IMMEDIATE (Full level)</P>
+# </TD>
+# </TR>
+ SQL_ALTER_DOMAIN => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ALTER_TABLE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses in the <B>ALTER TABLE</B> statement supported by the data source.
+# <P>The SQL-92 or FIPS conformance level at which this feature needs to be supported is shown in parentheses next to each bitmask.</P>
+#
+# <P>The following bitmasks are used to determine which clauses are supported:</P>
+#
+# <P>SQL_AT_ADD_COLUMN_COLLATION = &lt;add column&gt; clause is supported, with facility to specify column collation (Full level) (ODBC 3.0)</P>
+#
+# <P>SQL_AT_ADD_COLUMN_DEFAULT = &lt;add column&gt; clause is supported, with facility to specify column defaults (FIPS Transitional level) (ODBC 3.0)</P>
+#
+# <P>SQL_AT_ADD_COLUMN_SINGLE = &lt;add column&gt; is supported (FIPS Transitional level) (ODBC 3.0)</P>
+#
+# <P>SQL_AT_ADD_CONSTRAINT = &lt;add column&gt; clause is supported, with facility to specify column constraints (FIPS Transitional level) (ODBC 3.0)</P>
+#
+# <P>SQL_AT_ADD_TABLE_CONSTRAINT = &lt;add table constraint&gt; clause is supported (FIPS Transitional level) (ODBC 3.0)</P>
+#
+# <P>SQL_AT_CONSTRAINT_NAME_DEFINITION = &lt;constraint name definition&gt; is supported for naming column and table constraints (Intermediate level) (ODBC 3.0)</P>
+#
+# <P>SQL_AT_DROP_COLUMN_CASCADE = &lt;drop column&gt; CASCADE is supported (FIPS Transitional level) (ODBC 3.0)</P>
+#
+# <P>SQL_AT_DROP_COLUMN_DEFAULT = &lt;alter column&gt; &lt;drop column default clause&gt; is supported (Intermediate level) (ODBC 3.0)</P>
+#
+# <P>SQL_AT_DROP_COLUMN_RESTRICT = &lt;drop column&gt; RESTRICT is supported (FIPS Transitional level) (ODBC 3.0)</P>
+#
+# <P>SQL_AT_DROP_TABLE_CONSTRAINT_CASCADE (ODBC 3.0)</P>
+#
+# <P>SQL_AT_DROP_TABLE_CONSTRAINT_RESTRICT = &lt;drop column&gt; RESTRICT is supported (FIPS Transitional level) (ODBC 3.0)</P>
+#
+# <P>SQL_AT_SET_COLUMN_DEFAULT = &lt;alter column&gt; &lt;set column default clause&gt; is supported (Intermediate level) (ODBC 3.0)</P>
+#
+# <P>The following bits specify the support &lt;constraint attributes&gt; if specifying column or table constraints is supported (the SQL_AT_ADD_CONSTRAINT bit is set):</P>
+#
+# <P>SQL_AT_CONSTRAINT_INITIALLY_DEFERRED (Full level) (ODBC 3.0)<BR>
+# SQL_AT_CONSTRAINT_INITIALLY_IMMEDIATE (Full level) (ODBC 3.0)<BR>
+# SQL_AT_CONSTRAINT_DEFERRABLE (Full level) (ODBC 3.0)<BR>
+# SQL_AT_CONSTRAINT_NON_DEFERRABLE (Full level) (ODBC 3.0)</P>
+# </TD>
+# </TR>
+ SQL_ALTER_TABLE => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ASYNC_MODE<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER value indicating the level of asynchronous support in the driver:
+# <P>SQL_AM_CONNECTION = Connection level asynchronous execution is supported. Either all statement handles associated with a given connection handle are in asynchronous mode or all are in synchronous mode. A statement handle on a connection cannot be in asynchronous mode while another statement handle on the same connection is in synchronous mode, and vice versa.</P>
+#
+# <P>SQL_AM_STATEMENT = Statement level asynchronous execution is supported. Some statement handles associated with a connection handle can be in asynchronous mode, while other statement handles on the same connection are in synchronous mode.</P>
+#
+# <P>SQL_AM_NONE = Asynchronous mode is not supported.</P>
+# </TD>
+# </TR>
+ SQL_ASYNC_MODE => {
+ type => q(Long),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_BATCH_ROW_COUNT <BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the behavior of the driver with respect to the availability of row counts. The following bitmasks are used in conjunction with the information type:
+# <P>SQL_BRC_ROLLED_UP = Row counts for consecutive INSERT, DELETE, or UPDATE statements are rolled up into one. If this bit is not set, then row counts are available for each individual statement.</P>
+#
+# <P>SQL_BRC_PROCEDURES = Row counts, if any, are available when a batch is executed in a stored procedure. If row counts are available, they can be rolled up or individually available, depending on the SQL_BRC_ROLLED_UP bit.</P>
+#
+# <P>SQL_BRC_EXPLICIT = Row counts, if any, are available when a batch is executed directly by calling <B>SQLExecute</B> or <B>SQLExecDirect</B>. If row counts are available, they can be rolled up or individually available, depending on the SQL_BRC_ROLLED_UP bit.</P>
+# </TD>
+# </TR>
+ SQL_BATCH_ROW_COUNT => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_BATCH_SUPPORT <BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the driver's support for batches. The following bitmasks are used to determine which level is supported:
+# <P>SQL_BS_SELECT_EXPLICIT = The driver supports explicit batches that can have result-set generating statements.</P>
+#
+# <P>SQL_BS_ROW_COUNT_EXPLICIT = The driver supports explicit batches that can have row-count generating statements.</P>
+#
+# <P>SQL_BS_SELECT_PROC = The driver supports explicit procedures that can have result-set generating statements.</P>
+#
+# <P>SQL_BS_ROW_COUNT_PROC = The driver supports explicit procedures that can have row-count generating statements.</P>
+# </TD>
+# </TR>
+ SQL_BATCH_SUPPORT => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_BOOKMARK_PERSISTENCE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the operations through which bookmarks persist.
+# <P>The following bitmasks are used in conjunction with the flag to determine through which options bookmarks persist:</P>
+#
+# <P>SQL_BP_CLOSE = Bookmarks are valid after an application calls <B>SQLFreeStmt</B> with the SQL_CLOSE option, or <B>SQLCloseCursor</B> to close the cursor associated with a statement.</P>
+#
+# <P>SQL_BP_DELETE = The bookmark for a row is valid after that row has been deleted.</P>
+#
+# <P>SQL_BP_DROP = Bookmarks are valid after an application calls <B>SQLFreeHandle</B> with a <I>HandleType</I> of SQL_HANDLE_STMT to drop a statement.</P>
+#
+# <P>SQL_BP_TRANSACTION = Bookmarks are valid after an application commits or rolls back a transaction.</P>
+#
+# <P>SQL_BP_UPDATE = The bookmark for a row is valid after any column in that row has been updated, including key columns.</P>
+#
+# <P>SQL_BP_OTHER_HSTMT = A bookmark associated with one statement can be used with another statement. Unless SQL_BP_CLOSE or SQL_BP_DROP is specified, the cursor on the first statement must be open.</P>
+# </TD>
+# </TR>
+ SQL_BOOKMARK_PERSISTENCE => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CATALOG_LOCATION<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value indicating the position of the catalog in a qualified table name:
+# <P>SQL_CL_START<BR>
+# SQL_CL_END</P>
+#
+# <P>For example, an Xbase driver returns SQL_CL_START because the directory (catalog) name is at the start of the table name, as in \EMPDATA\EMP.DBF. An ORACLE Server driver returns SQL_CL_END because the catalog is at the end of the table name, as in ADMIN.EMP@EMPDATA.</P>
+#
+# <P>An SQL-92 Full level&#0150;conformant driver will always return SQL_CL_START. A value of 0 is returned if catalogs are not supported by the data source. To find out whether catalogs are supported, an application calls <B>SQLGetInfo</B> with the SQL_CATALOG_NAME information type.</P>
+#
+# <P>This <I>InfoType</I> has been renamed for ODBC 3.0 from the ODBC 2.0 <I>InfoType</I> SQL_QUALIFIER_LOCATION.</P>
+# </TD>
+# </TR>
+ SQL_CATALOG_LOCATION => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CATALOG_NAME<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>A character string: "Y" if the server supports catalog names, or "N" if it does not.
+# <P>An SQL-92 Full level&#0150;conformant driver will always return "Y".</P>
+# </TD>
+# </TR>
+ SQL_CATALOG_NAME => {
+ type => q(YesNo),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CATALOG_NAME_SEPARATOR<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string: the character or characters that the data source defines as the separator between a catalog name and the qualified name element that follows or precedes it.
+# <P>An empty string is returned if catalogs are not supported by the data source. To find out whether catalogs are supported, an application calls <B>SQLGetInfo</B> with the SQL_CATALOG_NAME information type. An SQL-92 Full level&#0150;conformant driver will always return ".".</P>
+#
+# <P>This <I>InfoType</I> has been renamed for ODBC 3.0 from the ODBC 2.0 <I>InfoType</I> SQL_QUALIFIER_NAME_SEPARATOR.</P>
+# </TD>
+# </TR>
+ SQL_CATALOG_NAME_SEPARATOR => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CATALOG_TERM<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string with the data source vendor's name for a catalog; for example, "database" or "directory". This string can be in upper, lower, or mixed case.
+# <P>An empty string is returned if catalogs are not supported by the data source. To find out whether catalogs are supported, an application calls <B>SQLGetInfo</B> with the SQL_CATALOG_NAME information type. An SQL-92 Full level&#0150;conformant driver will always return "catalog".</P>
+#
+# <P>This <I>InfoType</I> has been renamed for ODBC 3.0 from the ODBC 2.0 <I>InfoType</I> SQL_QUALIFIER_TERM.</P>
+# </TD>
+# </TR>
+ SQL_CATALOG_TERM => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CATALOG_USAGE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the statements in which catalogs can be used.
+# <P>The following bitmasks are used to determine where catalogs can be used:</P>
+#
+# <P>SQL_CU_DML_STATEMENTS = Catalogs are supported in all Data Manipulation Language statements: <B>SELECT</B>, <B>INSERT</B>, <B>UPDATE</B>, <B>DELETE</B>, and if supported, <B>SELECT FOR UPDATE</B> and positioned update and delete statements.</P>
+#
+# <P>SQL_CU_PROCEDURE_INVOCATION = Catalogs are supported in the ODBC procedure invocation statement.</P>
+#
+# <P>SQL_CU_TABLE_DEFINITION = Catalogs are supported in all table definition statements: <B>CREATE TABLE</B>, <B>CREATE VIEW</B>, <B>ALTER TABLE</B>, <B>DROP TABLE</B>, and <B>DROP VIEW</B>.</P>
+#
+# <P>SQL_CU_INDEX_DEFINITION = Catalogs are supported in all index definition statements: <B>CREATE INDEX</B> and <B>DROP INDEX</B>.</P>
+#
+# <P>SQL_CU_PRIVILEGE_DEFINITION = Catalogs are supported in all privilege definition statements: <B>GRANT</B> and <B>REVOKE</B>. </P>
+#
+# <P>A value of 0 is returned if catalogs are not supported by the data source. To find out whether catalogs are supported, an application calls <B>SQLGetInfo</B> with the SQL_CATALOG_NAME information type. An SQL-92 Full level&#0150;conformant driver will always return a bitmask with all of these bits set.</P>
+#
+# <P>This <I>InfoType</I> has been renamed for ODBC 3.0 from the ODBC 2.0 <I>InfoType</I> SQL_QUALIFIER_USAGE.</P>
+# </TD>
+# </TR>
+ SQL_CATALOG_USAGE => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_COLLATION_SEQ<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>The name of the collation sequence. This is a character string that indicates the name of the default collation for the default character set for this server (for example, 'ISO 8859-1' or EBCDIC). If this is unknown, an empty string will be returned. An SQL-92 Full level&#0150;conformant driver will always return a non-empty string.</TD>
+# </TR>
+ SQL_COLLATION_SEQ => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_COLUMN_ALIAS<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>A character string: "Y" if the data source supports column aliases; otherwise, "N".
+# <P>A column alias is an alternate name that can be specified for a column in the select list by using an AS clause. An SQL-92 Entry level&#0150;conformant driver will always return "Y".</P>
+# </TD>
+# </TR>
+ SQL_COLUMN_ALIAS => {
+ type => q(YesNo),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CONCAT_NULL_BEHAVIOR<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value indicating how the data source handles the concatenation of NULL valued character data type columns with non-NULL valued character data type columns:
+# <P>SQL_CB_NULL = Result is NULL valued.</P>
+#
+# <P>SQL_CB_NON_NULL = Result is concatenation of non-NULL valued column or columns. </P>
+#
+# <P>An SQL-92 Entry level&#0150;conformant driver will always return SQL_CB_NULL.</P>
+# </TD>
+# </TR>
+ SQL_CONCAT_NULL_BEHAVIOR => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CONVERT_BIGINT<BR>
+ SQL_CONVERT_BIGINT => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_BINARY<BR>
+ SQL_CONVERT_BINARY => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_BIT <BR>
+ SQL_CONVERT_BIT => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_CHAR <BR>
+ SQL_CONVERT_CHAR => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_GUID<BR>
+ SQL_CONVERT_GUID => {
+ type => q(Bitmask),
+ omit => 1,
+ },
+# SQL_CONVERT_DATE<BR>
+ SQL_CONVERT_DATE => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_DECIMAL<BR>
+ SQL_CONVERT_DECIMAL => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_DOUBLE<BR>
+ SQL_CONVERT_DOUBLE => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_FLOAT<BR>
+ SQL_CONVERT_FLOAT => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_INTEGER<BR>
+ SQL_CONVERT_INTEGER => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_INTERVAL_YEAR_MONTH<BR>
+ SQL_CONVERT_INTERVAL_YEAR_MONTH => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_INTERVAL_DAY_TIME<BR>
+ SQL_CONVERT_INTERVAL_DAY_TIME => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_LONGVARBINARY<BR>
+ SQL_CONVERT_LONGVARBINARY => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_LONGVARCHAR<BR>
+ SQL_CONVERT_LONGVARCHAR => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_NUMERIC<BR>
+ SQL_CONVERT_NUMERIC => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_REAL<BR>
+ SQL_CONVERT_REAL => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_SMALLINT<BR>
+ SQL_CONVERT_SMALLINT => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_TIME<BR>
+ SQL_CONVERT_TIME => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_TIMESTAMP<BR>
+ SQL_CONVERT_TIMESTAMP => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_TINYINT<BR>
+ SQL_CONVERT_TINYINT => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_VARBINARY<BR>
+ SQL_CONVERT_VARBINARY => {
+ type => q(Bitmask),
+ },
+# SQL_CONVERT_VARCHAR <BR>
+ SQL_CONVERT_VARCHAR => {
+ type => q(Bitmask),
+ },
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask. The bitmask indicates the conversions supported by the data source with the <B>CONVERT</B> scalar function for data of the type named in the <I>InfoType</I>. If the bitmask equals zero, the data source does not support any conversions from data of the named type, including conversion to the same data type.
+# <P>For example, to find out if a data source supports the conversion of SQL_INTEGER data to the SQL_BIGINT data type, an application calls <B>SQLGetInfo</B> with the <I>InfoType</I> of SQL_CONVERT_INTEGER. The application performs an <B>AND</B> operation with the returned bitmask and SQL_CVT_BIGINT. If the resulting value is nonzero, the conversion is supported. </P>
+#
+# <P>The following bitmasks are used to determine which conversions are supported:</P>
+#
+# <P>SQL_CVT_BIGINT (ODBC 1.0)<BR>
+# SQL_CVT_BINARY (ODBC 1.0)<BR>
+# SQL_CVT_BIT (ODBC 1.0) <BR>
+# SQL_CVT_GUID (ODBC 3.5)<BR>
+# SQL_CVT_CHAR (ODBC 1.0) <BR>
+# SQL_CVT_DATE (ODBC 1.0)<BR>
+# SQL_CVT_DECIMAL (ODBC 1.0)<BR>
+# SQL_CVT_DOUBLE (ODBC 1.0)<BR>
+# SQL_CVT_FLOAT (ODBC 1.0)<BR>
+# SQL_CVT_INTEGER (ODBC 1.0)<BR>
+# SQL_CVT_INTERVAL_YEAR_MONTH (ODBC 3.0)<BR>
+# SQL_CVT_INTERVAL_DAY_TIME (ODBC 3.0)<BR>
+# SQL_CVT_LONGVARBINARY (ODBC 1.0)<BR>
+# SQL_CVT_LONGVARCHAR (ODBC 1.0)<BR>
+# SQL_CVT_NUMERIC (ODBC 1.0)<BR>
+# SQL_CVT_REAL ODBC 1.0)<BR>
+# SQL_CVT_SMALLINT (ODBC 1.0)<BR>
+# SQL_CVT_TIME (ODBC 1.0)<BR>
+# SQL_CVT_TIMESTAMP (ODBC 1.0)<BR>
+# SQL_CVT_TINYINT (ODBC 1.0)<BR>
+# SQL_CVT_VARBINARY (ODBC 1.0)<BR>
+# SQL_CVT_VARCHAR (ODBC 1.0)</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CONVERT_FUNCTIONS<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the scalar conversion functions supported by the driver and associated data source.
+# <P>The following bitmask is used to determine which conversion functions are supported:</P>
+#
+# <P>SQL_FN_CVT_CAST<BR>
+# SQL_FN_CVT_CONVERT</P>
+# </TD>
+# </TR>
+ SQL_CONVERT_FUNCTIONS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CORRELATION_NAME<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value indicating whether table correlation names are supported:
+# <P>SQL_CN_NONE = Correlation names are not supported.</P>
+#
+# <P>SQL_CN_DIFFERENT = Correlation names are supported but must differ from the names of the tables they represent.</P>
+#
+# <P>SQL_CN_ANY = Correlation names are supported and can be any valid user-defined name. </P>
+#
+# <P>An SQL-92 Entry level&#0150;conformant driver will always return SQL_CN_ANY.</P>
+# </TD>
+# </TR>
+ SQL_CORRELATION_NAME => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CREATE_ASSERTION<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses in the <B>CREATE ASSERTION</B> statement, as defined in SQL-92, supported by the data source.
+# <P>The following bitmasks are used to determine which clauses are supported:</P>
+#
+# <P>SQL_CA_CREATE_ASSERTION</P>
+#
+# <P>The following bits specify the supported constraint attribute if the ability to specify constraint attributes explicitly is supported (see the SQL_ALTER_TABLE and SQL_CREATE_TABLE information types):</P>
+#
+# <P>SQL_CA_CONSTRAINT_INITIALLY_DEFERRED<BR>
+# SQL_CA_CONSTRAINT_INITIALLY_IMMEDIATE<BR>
+# SQL_CA_CONSTRAINT_DEFERRABLE<BR>
+# SQL_CA_CONSTRAINT_NON_DEFERRABLE</P>
+#
+# <P>An SQL-92 Full level&#0150;conformant driver will always return all of these options as supported. A return value of "0" means that the <B>CREATE ASSERTION</B> statement is not supported.</P>
+# </TD>
+# </TR>
+ SQL_CREATE_ASSERTION => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CREATE_CHARACTER_SET<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses in the <B>CREATE CHARACTER SET</B> statement, as defined in SQL-92, supported by the data source.
+# <P>The following bitmasks are used to determine which clauses are supported:</P>
+#
+# <P>SQL_CCS_CREATE_CHARACTER_SET<BR>
+# SQL_CCS_COLLATE_CLAUSE<BR>
+# SQL_CCS_LIMITED_COLLATION</P>
+#
+# <P>An SQL-92 Full level&#0150;conformant driver will always return all of these options as supported. A return value of "0" means that the <B>CREATE CHARACTER SET</B> statement is not supported.</P>
+# </TD>
+# </TR>
+ SQL_CREATE_CHARACTER_SET => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CREATE_COLLATION<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses in the <B>CREATE COLLATION</B> statement, as defined in SQL-92, supported by the data source.
+# <P>The following bitmask is used to determine which clauses are supported:</P>
+#
+# <P>SQL_CCOL_CREATE_COLLATION </P>
+#
+# <P>An SQL-92 Full level&#0150;conformant driver will always return this option as supported. A return value of "0" means that the <B>CREATE COLLATION</B> statement is not supported.</P>
+# </TD>
+# </TR>
+ SQL_CREATE_COLLATION => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CREATE_DOMAIN<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses in the <B>CREATE DOMAIN</B> statement, as defined in SQL-92, supported by the data source.
+# <P>The following bitmasks are used to determine which clauses are supported:</P>
+#
+# <P>SQL_CDO_CREATE_DOMAIN = The CREATE DOMAIN statement is supported (Intermediate level).</P>
+#
+# <P>SQL_CDO_CONSTRAINT_NAME_DEFINITION = &lt;constraint name definition&gt; is supported for naming domain constraints (Intermediate level).</P>
+#
+# <P>The following bits specify the ability to create column constraints:<BR>
+# SQL_CDO_DEFAULT = Specifying domain constraints is supported (Intermediate level)<BR>
+# SQL_CDO_CONSTRAINT = Specifying domain defaults is supported (Intermediate level)<BR>
+# SQL_CDO_COLLATION = Specifying domain collation is supported (Full level)</P>
+#
+# <P>The following bits specify the supported constraint attributes if specifying domain constraints is supported (SQL_CDO_DEFAULT is set):</P>
+#
+# <P>SQL_CDO_CONSTRAINT_INITIALLY_DEFERRED (Full level)<BR>
+# SQL_CDO_CONSTRAINT_INITIALLY_IMMEDIATE (Full level)<BR>
+# SQL_CDO_CONSTRAINT_DEFERRABLE (Full level)<BR>
+# SQL_CDO_CONSTRAINT_NON_DEFERRABLE (Full level)</P>
+#
+# <P>A return value of "0" means that the <B>CREATE DOMAIN</B> statement is not supported.</P>
+# </TD>
+# </TR>
+ SQL_CREATE_DOMAIN => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CREATE_SCHEMA<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses in the <B>CREATE SCHEMA</B> statement, as defined in SQL-92, supported by the data source.
+# <P>The following bitmasks are used to determine which clauses are supported:</P>
+#
+# <P>SQL_CS_CREATE_SCHEMA<BR>
+# SQL_CS_AUTHORIZATION<BR>
+# SQL_CS_DEFAULT_CHARACTER_SET </P>
+#
+# <P>An SQL-92 Intermediate level&#0150;conformant driver will always return the SQL_CS_CREATE_SCHEMA and SQL_CS_AUTHORIZATION options as supported. These must also be supported at the SQL-92 Entry level, but not necessarily as SQL statements. An SQL-92 Full level&#0150;conformant driver will always return all of these options as supported.</P>
+# </TD>
+# </TR>
+ SQL_CREATE_SCHEMA => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CREATE_TABLE<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses in the <B>CREATE TABLE</B> statement, as defined in SQL-92, supported by the data source.
+# <P>The SQL-92 or FIPS conformance level at which this feature needs to be supported is shown in parentheses next to each bitmask.</P>
+#
+# <P>The following bitmasks are used to determine which clauses are supported:</P>
+#
+# <P>SQL_CT_CREATE_TABLE = The CREATE TABLE statement is supported. (Entry level)</P>
+#
+# <P>SQL_CT_TABLE_CONSTRAINT = Specifying table constraints is supported (FIPS Transitional level)</P>
+#
+# <P>SQL_CT_CONSTRAINT_NAME_DEFINITION = The &lt;constraint name definition&gt; clause is supported for naming column and table constraints (Intermediate level)</P>
+#
+# <P>The following bits specify the ability to create temporary tables:</P>
+#
+# <P>SQL_CT_COMMIT_PRESERVE = Deleted rows are preserved on commit. (Full level)<BR>
+# SQL_CT_COMMIT_DELETE = Deleted rows are deleted on commit. (Full level)<BR>
+# SQL_CT_GLOBAL_TEMPORARY = Global temporary tables can be created. (Full level)<BR>
+# SQL_CT_LOCAL_TEMPORARY = Local temporary tables can be created. (Full level)</P>
+#
+# <P>The following bits specify the ability to create column constraints:</P>
+#
+# <P>SQL_CT_COLUMN_CONSTRAINT = Specifying column constraints is supported (FIPS Transitional level)<BR>
+# SQL_CT_COLUMN_DEFAULT = Specifying column defaults is supported (FIPS Transitional level)<BR>
+# SQL_CT_COLUMN_COLLATION = Specifying column collation is supported (Full level)</P>
+#
+# <P>The following bits specify the supported constraint attributes if specifying column or table constraints is supported:</P>
+#
+# <P>SQL_CT_CONSTRAINT_INITIALLY_DEFERRED (Full level)<BR>
+# SQL_CT_CONSTRAINT_INITIALLY_IMMEDIATE (Full level)<BR>
+# SQL_CT_CONSTRAINT_DEFERRABLE (Full level)<BR>
+# SQL_CT_CONSTRAINT_NON_DEFERRABLE (Full level)</P>
+# </TD>
+# </TR>
+ SQL_CREATE_TABLE => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CREATE_TRANSLATION<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses in the <B>CREATE TRANSLATION</B> statement, as defined in SQL-92, supported by the data source.
+# <P>The following bitmask is used to determine which clauses are supported:</P>
+#
+# <P>SQL_CTR_CREATE_TRANSLATION</P>
+#
+# <P>An SQL-92 Full level&#0150;conformant driver will always return these options as supported. A return value of "0" means that the <B>CREATE TRANSLATION</B> statement is not supported.</P>
+# </TD>
+# </TR>
+ SQL_CREATE_TRANSLATION => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CREATE_VIEW<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses in the <B>CREATE VIEW</B> statement, as defined in SQL-92, supported by the data source.
+# <P>The following bitmasks are used to determine which clauses are supported:</P>
+#
+# <P>SQL_CV_CREATE_VIEW<BR>
+# SQL_CV_CHECK_OPTION<BR>
+# SQL_CV_CASCADED<BR>
+# SQL_CV_LOCAL </P>
+#
+# <P>A return value of "0" means that the <B>CREATE VIEW</B> statement is not supported.</P>
+#
+# <P>An SQL-92 Entry level&#0150;conformant driver will always return the SQL_CV_CREATE_VIEW and SQL_CV_CHECK_OPTION options as supported. </P>
+#
+# <P>An SQL-92 Full level&#0150;conformant driver will always return all of these options as supported.</P>
+# </TD>
+# </TR>
+ SQL_CREATE_VIEW => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CURSOR_COMMIT_BEHAVIOR<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value indicating how a <B>COMMIT</B> operation affects cursors and prepared statements in the data source:
+# <P>SQL_CB_DELETE = Close cursors and delete prepared statements. To use the cursor again, the application must reprepare and reexecute the statement.</P>
+#
+# <P>SQL_CB_CLOSE = Close cursors. For prepared statements, the application can call <B>SQLExecute</B> on the statement without calling <B>SQLPrepare</B> again.</P>
+#
+# <P>SQL_CB_PRESERVE = Preserve cursors in the same position as before the <B>COMMIT</B> operation. The application can continue to fetch data, or it can close the cursor and reexecute the statement without repreparing it.</P>
+# </TD>
+# </TR>
+ SQL_CURSOR_COMMIT_BEHAVIOR => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CURSOR_ROLLBACK_BEHAVIOR<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value indicating how a <B>ROLLBACK</B> operation affects cursors and prepared statements in the data source:
+# <P>SQL_CB_DELETE = Close cursors and delete prepared statements. To use the cursor again, the application must reprepare and reexecute the statement.</P>
+#
+# <P>SQL_CB_CLOSE = Close cursors. For prepared statements, the application can call <B>SQLExecute</B> on the statement without calling <B>SQLPrepare</B> again.</P>
+#
+# <P>SQL_CB_PRESERVE = Preserve cursors in the same position as before the <B>ROLLBACK</B> operation. The application can continue to fetch data, or it can close the cursor and reexecute the statement without repreparing it.</P>
+# </TD>
+# </TR>
+ SQL_CURSOR_ROLLBACK_BEHAVIOR => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_CURSOR_ROLLBACK_SQL_CURSOR_SENSITIVITY<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER value indicating the support for cursor sensitivity:
+# <P>SQL_INSENSITIVE = All cursors on the statement handle show the result set without reflecting any changes made to it by any other cursor within the same transaction.</P>
+#
+# <P>SQL_UNSPECIFIED = It is unspecified whether cursors on the statement handle make visible the changes made to a result set by another cursor within the same transaction. Cursors on the statement handle may make visible none, some, or all such changes.</P>
+#
+# <P>SQL_SENSITIVE = Cursors are sensitive to changes made by other cursors within the same transaction.</P>
+#
+# <P>An SQL-92 Entry level&#0150;conformant driver will always return the SQL_UNSPECIFIED option as supported. </P>
+#
+# <P>An SQL-92 Full level&#0150;conformant driver will always return the SQL_INSENSITIVE option as supported.</P>
+# </TD>
+# </TR>
+ SQL_CURSOR_SENSITIVITY => {
+ type => q(Long),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DATA_SOURCE_NAME<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string with the data source name used during connection. If the application called <B>SQLConnect</B>, this is the value of the <I>szDSN</I> argument. If the application called <B>SQLDriverConnect</B> or <B>SQLBrowseConnect</B>, this is the value of the DSN keyword in the connection string passed to the driver. If the connection string did not contain the <B>DSN</B> keyword (such as when it contains the <B>DRIVER</B> keyword), this is an empty string.</TD>
+# </TR>
+ SQL_DATA_SOURCE_NAME => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DATA_SOURCE_READ_ONLY<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string. "Y" if the data source is set to READ ONLY mode, "N" if it is otherwise.
+# <P>This characteristic pertains only to the data source itself; it is not a characteristic of the driver that enables access to the data source. A driver that is read/write can be used with a data source that is read-only. If a driver is read-only, all of its data sources must be read-only and must return SQL_DATA_SOURCE_READ_ONLY.</P>
+# </TD>
+# </TR>
+ SQL_DATA_SOURCE_READ_ONLY => {
+ type => q(YesNo),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DATABASE_NAME<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string with the name of the current database in use, if the data source defines a named object called "database".
+# <P class="indent"><b class="le">Note</b>&nbsp;&nbsp;&nbsp;In ODBC 3<I>.x</I>, the value returned for this <I>InfoType</I> can also be returned by calling <B>SQLGetConnectAttr</B> with an <I>Attribute</I> argument of SQL_ATTR_CURRENT_CATALOG.</P>
+# </TD>
+# </TR>
+ SQL_DATABASE_NAME => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DATETIME_LITERALS<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the SQL-92 datetime literals supported by the data source. Note that these are the datetime literals listed in the SQL-92 specification and are separate from the datetime literal escape clauses defined by ODBC. For more information about the ODBC datetime literal escape clauses, see "Date, Time, Timestamp, and Datetime Interval Literals" in Chapter 8: SQL Statements.
+# <P>A FIPS Transitional level&#0150;conformant driver will always return the "1" value in the bitmask for the bits listed below. A value of "0" means that SQL-92 datetime literals are not supported.</P>
+#
+# <P>The following bitmasks are used to determine which literals are supported:</P>
+#
+# <P>SQL_DL_SQL92_DATE<BR>
+# SQL_DL_SQL92_TIME<BR>
+# SQL_DL_SQL92_TIMESTAMP<BR>
+# SQL_DL_SQL92_INTERVAL_YEAR<BR>
+# SQL_DL_SQL92_INTERVAL_MONTH<BR>
+# SQL_DL_SQL92_INTERVAL_DAY<BR>
+# SQL_DL_SQL92_INTERVAL_HOUR<BR>
+# SQL_DL_SQL92_INTERVAL_MINUTE<BR>
+# SQL_DL_SQL92_INTERVAL_SECOND<BR>
+# SQL_DL_SQL92_INTERVAL_YEAR_TO_MONTH<BR>
+# SQL_DL_SQL92_INTERVAL_DAY_TO_HOUR</P>
+#
+# <P>SQL_DL_SQL92_INTERVAL_DAY_TO_MINUTE<BR>
+# SQL_DL_SQL92_INTERVAL_DAY_TO_SECOND<BR>
+# SQL_DL_SQL92_INTERVAL_HOUR_TO_MINUTE<BR>
+# SQL_DL_SQL92_INTERVAL_HOUR_TO_SECOND<BR>
+# SQL_DL_SQL92_INTERVAL_MINUTE_TO_SECOND</P>
+# </TD>
+# </TR>
+ SQL_DATETIME_LITERALS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DBMS_NAME<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string with the name of the DBMS product accessed by the driver.</TD>
+# </TR>
+ SQL_DBMS_NAME => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DBMS_VER<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string indicating the version of the DBMS product accessed by the driver. The version is of the form ##.##.####, where the first two digits are the major version, the next two digits are the minor version, and the last four digits are the release version. The driver must render the DBMS product version in this form but can also append the DBMS product-specific version as well. For example, "04.01.0000 Rdb 4.1".</TD>
+# </TR>
+ SQL_DBMS_VER => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DDL_INDEX<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER value that indicates support for creation and dropping of indexes:
+# <P>SQL_DI_CREATE_INDEX<BR>
+# SQL_DI_DROP_INDEX </P>
+# </TD>
+# </TR>
+ SQL_DDL_INDEX => {
+ type => q(Long),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DEFAULT_TXN_ISOLATION<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUINTEGER value that indicates the default transaction isolation level supported by the driver or data source, or zero if the data source does not support transactions. The following terms are used to define transaction isolation levels:
+# <P><B>Dirty Read </B>Transaction 1 changes a row. Transaction 2 reads the changed row before transaction 1 commits the change. If transaction 1 rolls back the change, transaction 2 will have read a row that is considered to have never existed.</P>
+#
+# <P><B>Nonrepeatable Read </B>Transaction 1 reads a row. Transaction 2 updates or deletes that row and commits this change. If transaction 1 attempts to reread the row, it will receive different row values or discover that the row has been deleted.</P>
+#
+# <P><B>Phantom </B>Transaction 1 reads a set of rows that satisfy some search criteria. Transaction 2 generates one or more rows (through either inserts or updates) that match the search criteria. If transaction 1 reexecutes the statement that reads the rows, it receives a different set of rows.</P>
+#
+# <P>If the data source supports transactions, the driver returns one of the following bitmasks:</P>
+#
+# <P>SQL_TXN_READ_UNCOMMITTED = Dirty reads, nonrepeatable reads, and phantoms are possible.</P>
+#
+# <P>SQL_TXN_READ_COMMITTED = Dirty reads are not possible. Nonrepeatable reads and phantoms are possible.</P>
+#
+# <P>SQL_TXN_REPEATABLE_READ = Dirty reads and nonrepeatable reads are not possible. Phantoms are possible.</P>
+#
+# <P>SQL_TXN_SERIALIZABLE = Transactions are serializable. Serializable transactions do not allow dirty reads, nonrepeatable reads, or phantoms.</P>
+# </TD>
+# </TR>
+ SQL_DEFAULT_TXN_ISOLATION => {
+ type => q(Long),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DESCRIBE_PARAMETER<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>A character string: "Y" if parameters can be described; "N", if not.
+# <P>An SQL-92 Full level&#0150;conformant driver will usually return "Y" because it will support the <B>DESCRIBE INPUT</B> statement. Because this does not directly specify the underlying SQL support, however, describing parameters might not be supported, even in a SQL-92 Full level&#0150;conformant driver.</P>
+# </TD>
+# </TR>
+ SQL_DESCRIBE_PARAMETER => {
+ type => q(YesNo),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DM_VER<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>A character string with the version of the Driver Manager. The version is of the form ##.##.####.####, where:
+# <P>The first set of two digits is the major ODBC version, as given by the constant SQL_SPEC_MAJOR.</P>
+#
+# <P>The second set of two digits is the minor ODBC version, as given by the constant SQL_SPEC_MINOR.</P>
+#
+# <P>The third set of four digits is the Driver Manager major build number.</P>
+#
+# <P>The last set of four digits is the Driver Manager minor build number.</P>
+# </TD>
+# </TR>
+ SQL_DM_VER => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DRIVER_HDBC<BR>
+# SQL_DRIVER_HENV<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUINTEGER value, the driver's environment handle or connection handle, determined by the argument <I>InfoType</I>.
+# <P>These information types are implemented by the Driver Manager alone.</P>
+# </TD>
+# </TR>
+ SQL_DRIVER_HDBC => {
+ type => q(Long),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DRIVER_HDESC<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER value, the driver's descriptor handle determined by the Driver Manager's descriptor handle, which must be passed on input in *<I>InfoValuePtr</I> from the application. In this case, <I>InfoValuePtr</I> is both an input and output argument. The input descriptor handle passed in *<I>InfoValuePtr</I> must have been either explicitly or implicitly allocated on the <I>ConnectionHandle</I>.
+# <P>The application should make a copy of the Driver Manager's descriptor handle before calling <B>SQLGetInfo</B> with this information type, to ensure that the handle is not overwritten on output.</P>
+#
+# <P>This information type is implemented by the Driver Manager alone.</P>
+# </TD>
+# </TR>
+ SQL_DRIVER_HDESC => {
+ type => q(Long),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DRIVER_HLIB<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUINTEGER value, the <I>hinst</I> from the load library returned to the Driver Manager when it loaded the driver DLL (on a Microsoft&reg; Windows&reg; platform) or equivalent on a non-Windows platform. The handle is valid only for the connection handle specified in the call to <B>SQLGetInfo</B>.
+# <P>This information type is implemented by the Driver Manager alone.</P>
+# </TD>
+# </TR>
+ SQL_DRIVER_HLIB => {
+ type => q(Long),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DRIVER_HSTMT<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUINTEGER value, the driver's statement handle determined by the Driver Manager statement handle, which must be passed on input in *<I>InfoValuePtr</I> from the application. In this case, <I>InfoValuePtr</I> is both an input and an output argument. The input statement handle passed in *<I>InfoValuePtr</I> must have been allocated on the argument <I>ConnectionHandle</I>.
+# <P>The application should make a copy of the Driver Manager's statement handle before calling <B>SQLGetInfo</B> with this information type, to ensure that the handle is not overwritten on output.</P>
+#
+# <P>This information type is implemented by the Driver Manager alone.</P>
+# </TD>
+# </TR>
+ SQL_DRIVER_HSTMT => {
+ type => q(Long),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DRIVER_NAME<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string with the file name of the driver used to access the data source.</TD>
+# </TR>
+ SQL_DRIVER_NAME => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DRIVER_ODBC_VER<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>A character string with the version of ODBC that the driver supports. The version is of the form ##.##, where the first two digits are the major version and the next two digits are the minor version. SQL_SPEC_MAJOR and SQL_SPEC_MINOR define the major and minor version numbers. For the version of ODBC described in this manual, these are 3 and 0, and the driver should return "03.00".</TD>
+# </TR>
+ SQL_DRIVER_ODBC_VER => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DRIVER_VER<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string with the version of the driver and optionally, a description of the driver. At a minimum, the version is of the form ##.##.####, where the first two digits are the major version, the next two digits are the minor version, and the last four digits are the release version.</TD>
+# </TR>
+ SQL_DRIVER_VER => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DROP_ASSERTION<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses in the <B>DROP ASSERTION</B> statement, as defined in SQL-92, supported by the data source.
+# <P>The following bitmask is used to determine which clauses are supported:</P>
+#
+# <P>SQL_DA_DROP_ASSERTION </P>
+#
+# <P>An SQL-92 Full level&#0150;conformant driver will always return this option as supported.</P>
+# </TD>
+# </TR>
+ SQL_DROP_ASSERTION => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DROP_CHARACTER_SET<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses in the <B>DROP CHARACTER SET</B> statement, as defined in SQL-92, supported by the data source.
+# <P>The following bitmask is used to determine which clauses are supported:</P>
+#
+# <P>SQL_DCS_DROP_CHARACTER_SET </P>
+#
+# <P>An SQL-92 Full level&#0150;conformant driver will always return this option as supported.</P>
+# </TD>
+# </TR>
+ SQL_DROP_CHARACTER_SET => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DROP_COLLATION<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses in the <B>DROP COLLATION</B> statement, as defined in SQL-92, supported by the data source.
+# <P>The following bitmask is used to determine which clauses are supported:</P>
+#
+# <P>SQL_DC_DROP_COLLATION </P>
+#
+# <P>An SQL-92 Full level&#0150;conformant driver will always return this option as supported.</P>
+# </TD>
+# </TR>
+ SQL_DROP_COLLATION => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DROP_DOMAIN<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses in the <B>DROP DOMAIN</B> statement, as defined in SQL-92, supported by the data source.
+# <P>The following bitmasks are used to determine which clauses are supported:</P>
+#
+# <P>SQL_DD_DROP_DOMAIN<BR>
+# SQL_DD_CASCADE<BR>
+# SQL_DD_RESTRICT </P>
+#
+# <P>An SQL-92 Intermediate level&#0150;conformant driver will always return all of these options as supported.</P>
+# </TD>
+# </TR>
+ SQL_DROP_DOMAIN => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DROP_SCHEMA<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses in the <B>DROP SCHEMA</B> statement, as defined in SQL-92, supported by the data source.
+# <P>The following bitmasks are used to determine which clauses are supported:</P>
+#
+# <P>SQL_DS_DROP_SCHEMA<BR>
+# SQL_DS_CASCADE<BR>
+# SQL_DS_RESTRICT </P>
+#
+# <P>An SQL-92 Intermediate level&#0150;conformant driver will always return all of these options as supported.</P>
+# </TD>
+# </TR>
+ SQL_DROP_SCHEMA => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DROP_TABLE<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses in the <B>DROP TABLE</B> statement, as defined in SQL-92, supported by the data source.
+# <P>The following bitmasks are used to determine which clauses are supported:</P>
+#
+# <P>SQL_DT_DROP_TABLE<BR>
+# SQL_DT_CASCADE<BR>
+# SQL_DT_RESTRICT </P>
+#
+# <P>An FIPS Transitional level&#0150;conformant driver will always return all of these options as supported.</P>
+# </TD>
+# </TR>
+ SQL_DROP_TABLE => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DROP_TRANSLATION<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses in the <B>DROP TRANSLATION</B> statement, as defined in SQL-92, supported by the data source.
+# <P>The following bitmask is used to determine which clauses are supported:</P>
+#
+# <P>SQL_DTR_DROP_TRANSLATION </P>
+#
+# <P>An SQL-92 Full level&#0150;conformant driver will always return this option as supported.</P>
+# </TD>
+# </TR>
+ SQL_DROP_TRANSLATION => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DROP_VIEW<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses in the <B>DROP VIEW</B> statement, as defined in SQL-92, supported by the data source.
+# <P>The following bitmasks are used to determine which clauses are supported:</P>
+#
+# <P>SQL_DV_DROP_VIEW<BR>
+# SQL_DV_CASCADE<BR>
+# SQL_DV_RESTRICT </P>
+#
+# <P>An FIPS Transitional level&#0150;conformant driver will always return all of these options as supported.</P>
+# </TD>
+# </TR>
+ SQL_DROP_VIEW => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DYNAMIC_CURSOR_ATTRIBUTES1<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask that describes the attributes of a dynamic cursor that are supported by the driver. This bitmask contains the first subset of attributes; for the second subset, see SQL_DYNAMIC_CURSOR_ATTRIBUTES2.
+# <P>The following bitmasks are used to determine which attributes are supported:</P>
+#
+# <P>SQL_CA1_NEXT = A <I>FetchOrientation</I> argument of SQL_FETCH_NEXT is supported in a call to <B>SQLFetchScroll</B> when the cursor is a dynamic cursor.</P>
+#
+# <P>SQL_CA1_ABSOLUTE = <I>FetchOrientation</I> arguments of SQL_FETCH_FIRST, SQL_FETCH_LAST, and SQL_FETCH_ABSOLUTE are supported in a call to <B>SQLFetchScroll</B> when the cursor is a dynamic cursor. (The rowset that will be fetched is independent of the current cursor position.) </P>
+#
+# <P>SQL_CA1_RELATIVE = <I>FetchOrientation</I> arguments of SQL_FETCH_PRIOR and SQL_FETCH_RELATIVE are supported in a call to <B>SQLFetchScroll</B> when the cursor is a dynamic cursor. (The rowset that will be fetched is dependent on the current cursor position. Note that this is separated from SQL_FETCH_NEXT because in a forward-only cursor, only SQL_FETCH_NEXT is supported.) </P>
+#
+# <P>SQL_CA1_BOOKMARK = A <I>FetchOrientation</I> argument of SQL_FETCH_BOOKMARK is supported in a call to <B>SQLFetchScroll</B> when the cursor is a dynamic cursor. </P>
+#
+# <P>SQL_CA1_LOCK_EXCLUSIVE = A <I>LockType</I> argument of SQL_LOCK_EXCLUSIVE is supported in a call to <B>SQLSetPos</B> when the cursor is a dynamic cursor.</P>
+#
+# <P>SQL_CA1_LOCK_NO_CHANGE = A <I>LockType</I> argument of SQL_LOCK_NO_CHANGE is supported in a call to <B>SQLSetPos</B> when the cursor is a dynamic cursor. </P>
+#
+# <P>SQL_CA1_LOCK_UNLOCK = A <I>LockType</I> argument of SQL_LOCK_UNLOCK is supported in a call to <B>SQLSetPos</B> when the cursor is a dynamic cursor.</P>
+#
+# <P>SQL_CA1_POS_POSITION = An <I>Operation</I> argument of SQL_POSITION is supported in a call to <B>SQLSetPos</B> when the cursor is a dynamic cursor.</P>
+#
+# <P>SQL_CA1_POS_UPDATE = An <I>Operation</I> argument of SQL_UPDATE is supported in a call to <B>SQLSetPos</B> when the cursor is a dynamic cursor. </P>
+#
+# <P>SQL_CA1_POS_DELETE = An <I>Operation</I> argument of SQL_DELETE is supported in a call to <B>SQLSetPos</B> when the cursor is a dynamic cursor. </P>
+#
+# <P>SQL_CA1_POS_REFRESH = An <I>Operation</I> argument of SQL_REFRESH is supported in a call to <B>SQLSetPos</B> when the cursor is a dynamic cursor. </P>
+#
+# <P>SQL_CA1_POSITIONED_UPDATE = An UPDATE WHERE CURRENT OF SQL statement is supported when the cursor is a dynamic cursor. (An SQL-92 Entry level&#0150;conformant driver will always return this option as supported.)</P>
+#
+# <P>SQL_CA1_POSITIONED_DELETE = A DELETE WHERE CURRENT OF SQL statement is supported when the cursor is a dynamic cursor. (An SQL-92 Entry level&#0150;conformant driver will always return this option as supported.)</P>
+#
+# <P>SQL_CA1_SELECT_FOR_UPDATE = A SELECT FOR UPDATE SQL statement is supported when the cursor is a dynamic cursor. (An SQL-92 Entry level&#0150;conformant driver will always return this option as supported.)</P>
+#
+# <P>SQL_CA1_BULK_ADD = An <I>Operation</I> argument of SQL_ADD is supported in a call to <B>SQLBulkOperations</B> when the cursor is a dynamic cursor. </P>
+#
+# <P>SQL_CA1_BULK_UPDATE_BY_BOOKMARK = An <I>Operation</I> argument of SQL_UPDATE_BY_BOOKMARK is supported in a call to <B>SQLBulkOperations</B> when the cursor is a dynamic cursor. </P>
+#
+# <P>SQL_CA1_BULK_DELETE_BY_BOOKMARK = An <I>Operation</I> argument of SQL_DELETE_BY_BOOKMARK is supported in a call to <B>SQLBulkOperations</B> when the cursor is a dynamic cursor. </P>
+#
+# <P>SQL_CA1_BULK_FETCH_BY_BOOKMARK = An <I>Operation</I> argument of SQL_FETCH_BY_BOOKMARK is supported in a call to <B>SQLBulkOperations</B> when the cursor is a dynamic cursor. </P>
+#
+# <P>An SQL-92 Intermediate level&#0150;conformant driver will usually return the SQL_CA1_NEXT, SQL_CA1_ABSOLUTE, and SQL_CA1_RELATIVE options as supported, because it supports scrollable cursors through the embedded SQL FETCH statement. Because this does not directly determine the underlying SQL support, however, scrollable cursors may not be supported, even for an SQL-92 Intermediate level&#0150;conformant driver.</P>
+# </TD>
+# </TR>
+ SQL_DYNAMIC_CURSOR_ATTRIBUTES1 => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_DYNAMIC_CURSOR_ATTRIBUTES2<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask that describes the attributes of a dynamic cursor that are supported by the driver. This bitmask contains the second subset of attributes; for the first subset, see SQL_DYNAMIC_CURSOR_ATTRIBUTES1.
+# <P>The following bitmasks are used to determine which attributes are supported:</P>
+#
+# <P>SQL_CA2_READ_ONLY_CONCURRENCY = A read-only dynamic cursor, in which no updates are allowed, is supported. (The SQL_ATTR_CONCURRENCY statement attribute can be SQL_CONCUR_READ_ONLY for a dynamic cursor). </P>
+#
+# <P>SQL_CA2_LOCK_CONCURRENCY = A dynamic cursor that uses the lowest level of locking sufficient to ensure that the row can be updated is supported. (The SQL_ATTR_CONCURRENCY statement attribute can be SQL_CONCUR_LOCK for a dynamic cursor.) These locks must be consistent with the transaction isolation level set by the SQL_ATTR_TXN_ISOLATION connection attribute.</P>
+#
+# <P>SQL_CA2_OPT_ROWVER_CONCURRENCY = A dynamic cursor that uses the optimistic concurrency control comparing row versions is supported. (The SQL_ATTR_CONCURRENCY statement attribute can be SQL_CONCUR_ROWVER for a dynamic cursor.) </P>
+#
+# <P>SQL_CA2_OPT_VALUES_CONCURRENCY = A dynamic cursor that uses the optimistic concurrency control comparing values is supported. (The SQL_ATTR_CONCURRENCY statement attribute can be SQL_CONCUR_VALUES for a dynamic cursor.) </P>
+#
+# <P>SQL_CA2_SENSITIVITY_ADDITIONS = Added rows are visible to a dynamic cursor; the cursor can scroll to those rows. (Where these rows are added to the cursor is driver-dependent.) </P>
+#
+# <P>SQL_CA2_SENSITIVITY_DELETIONS = Deleted rows are no longer available to a dynamic cursor, and do not leave a "hole" in the result set; after the dynamic cursor scrolls from a deleted row, it cannot return to that row. </P>
+#
+# <P>SQL_CA2_SENSITIVITY_UPDATES = Updates to rows are visible to a dynamic cursor; if the dynamic cursor scrolls from and returns to an updated row, the data returned by the cursor is the updated data, not the original data. </P>
+#
+# <P>SQL_CA2_MAX_ROWS_SELECT = The SQL_ATTR_MAX_ROWS statement attribute affects <B>SELECT</B> statements when the cursor is a dynamic cursor. </P>
+#
+# <P>SQL_CA2_MAX_ROWS_INSERT = The SQL_ATTR_MAX_ROWS statement attribute affects <B>INSERT</B> statements when the cursor is a dynamic cursor. </P>
+#
+# <P>SQL_CA2_MAX_ROWS_DELETE = The SQL_ATTR_MAX_ROWS statement attribute affects <B>DELETE</B> statements when the cursor is a dynamic cursor. </P>
+#
+# <P>SQL_CA2_MAX_ROWS_UPDATE = The SQL_ATTR_MAX_ROWS statement attribute affects <B>UPDATE</B> statements when the cursor is a dynamic cursor. </P>
+#
+# <P>SQL_CA2_MAX_ROWS_CATALOG = The SQL_ATTR_MAX_ROWS statement attribute affects <B>CATALOG</B> result sets when the cursor is a dynamic cursor. </P>
+#
+# <P>SQL_CA2_MAX_ROWS_AFFECTS_ALL = The SQL_ATTR_MAX_ROWS statement attribute affects <B>SELECT</B>, <B>INSERT</B>, <B>DELETE</B>, and <B>UPDATE</B> statements, and <B>CATALOG</B> result sets, when the cursor is a dynamic cursor. </P>
+#
+# <P>SQL_CA2_CRC_EXACT = The exact row count is available in the SQL_DIAG_CURSOR_ROW_COUNT diagnostic field when the cursor is a dynamic cursor. </P>
+#
+# <P>SQL_CA2_CRC_APPROXIMATE = An approximate row count is available in the SQL_DIAG_CURSOR_ROW_COUNT diagnostic field when the cursor is a dynamic cursor. </P>
+#
+# <P>SQL_CA2_SIMULATE_NON_UNIQUE = The driver does not guarantee that simulated positioned update or delete statements will affect only one row when the cursor is a dynamic cursor; it is the application's responsibility to guarantee this. (If a statement affects more than one row, <B>SQLExecute</B> or <B>SQLExecDirect</B> returns SQLSTATE 01001 [Cursor operation conflict].) To set this behavior, the application calls <B>SQLSetStmtAttr</B> with the SQL_ATTR_SIMULATE_CURSOR attribute set to SQL_SC_NON_UNIQUE. </P>
+#
+# <P>SQL_CA2_SIMULATE_TRY_UNIQUE = The driver attempts to guarantee that simulated positioned update or delete statements will affect only one row when the cursor is a dynamic cursor. The driver always executes such statements, even if they might affect more than one row, such as when there is no unique key. (If a statement affects more than one row, <B>SQLExecute</B> or <B>SQLExecDirect</B> returns SQLSTATE 01001 [Cursor operation conflict].) To set this behavior, the application calls <B>SQLSetStmtAttr</B> with the SQL_ATTR_SIMULATE_CURSOR attribute set to SQL_SC_TRY_UNIQUE. </P>
+#
+# <P>SQL_CA2_SIMULATE_UNIQUE = The driver guarantees that simulated positioned update or delete statements will affect only one row when the cursor is a dynamic cursor. If the driver cannot guarantee this for a given statement, <B>SQLExecDirect</B> or <B>SQLPrepare</B> return SQLSTATE 01001 (Cursor operation conflict). To set this behavior, the application calls <B>SQLSetStmtAttr</B> with the SQL_ATTR_SIMULATE_CURSOR attribute set to SQL_SC_UNIQUE.</P>
+# </TD>
+# </TR>
+ SQL_DYNAMIC_CURSOR_ATTRIBUTES2 => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_EXPRESSIONS_IN_ORDERBY<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string: "Y" if the data source supports expressions in the <B>ORDER BY</B> list; "N" if it does not.</TD>
+# </TR>
+ SQL_EXPRESSIONS_IN_ORDERBY => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_FILE_USAGE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value indicating how a single-tier driver directly treats files in a data source:
+# <P>SQL_FILE_NOT_SUPPORTED = The driver is not a single-tier driver. For example, an ORACLE driver is a two-tier driver.</P>
+#
+# <P>SQL_FILE_TABLE = A single-tier driver treats files in a data source as tables. For example, an Xbase driver treats each Xbase file as a table.</P>
+#
+# <P>SQL_FILE_CATALOG = A single-tier driver treats files in a data source as a catalog. For example, a Microsoft&reg; Access driver treats each Microsoft Access file as a complete database.</P>
+#
+# <P>An application might use this to determine how users will select data. For example, Xbase users often think of data as stored in files, while ORACLE and MicrosoftAccess users generally think of data as stored in tables.</P>
+#
+# <P>When a user selects an Xbase data source, the application could display the Windows <B>File Open</B> common dialog box; when the user selects a Microsoft Access or ORACLE data source, the application could display a custom <B>Select Table</B> dialog box.</P>
+# </TD>
+# </TR>
+ SQL_FILE_USAGE => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask that describes the attributes of a forward-only cursor that are supported by the driver. This bitmask contains the first subset of attributes; for the second subset, see SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2.
+# <P>The following bitmasks are used to determine which attributes are supported:</P>
+#
+# <P>SQL_CA1_NEXT<BR>
+# SQL_CA1_LOCK_EXCLUSIVE<BR>
+# SQL_CA1_LOCK_NO_CHANGE<BR>
+# SQL_CA1_LOCK_UNLOCK<BR>
+# SQL_CA1_POS_POSITION<BR>
+# SQL_CA1_POS_UPDATE<BR>
+# SQL_CA1_POS_DELETE<BR>
+# SQL_CA1_POS_REFRESH<BR>
+# SQL_CA1_POSITIONED_UPDATE<BR>
+# SQL_CA1_POSITIONED_DELETE<BR>
+# SQL_CA1_SELECT_FOR_UPDATE<BR>
+# SQL_CA1_BULK_ADD<BR>
+# SQL_CA1_BULK_UPDATE_BY_BOOKMARK<BR>
+# SQL_CA1_BULK_DELETE_BY_BOOKMARK<BR>
+# SQL_CA1_BULK_FETCH_BY_BOOKMARK</P>
+#
+# <P>For descriptions of these bitmasks, see SQL_DYNAMIC_CURSOR_ATTRIBUTES1 (and substitute "forward-only cursor" for "dynamic cursor" in the descriptions). </P>
+# </TD>
+# </TR>
+ SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1 => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask that describes the attributes of a forward-only cursor that are supported by the driver. This bitmask contains the second subset of attributes; for the first subset, see SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1.
+# <P>The following bitmasks are used to determine which attributes are supported:</P>
+#
+# <P>SQL_CA2_READ_ONLY_CONCURRENCY<BR>
+# SQL_CA2_LOCK_CONCURRENCY<BR>
+# SQL_CA2_OPT_ROWVER_CONCURRENCY<BR>
+# SQL_CA2_OPT_VALUES_CONCURRENCY<BR>
+# SQL_CA2_SENSITIVITY_ADDITIONS<BR>
+# SQL_CA2_SENSITIVITY_DELETIONS<BR>
+# SQL_CA2_SENSITIVITY_UPDATES<BR>
+# SQL_CA2_MAX_ROWS_SELECT<BR>
+# SQL_CA2_MAX_ROWS_INSERT<BR>
+# SQL_CA2_MAX_ROWS_DELETE<BR>
+# SQL_CA2_MAX_ROWS_UPDATE<BR>
+# SQL_CA2_MAX_ROWS_CATALOG<BR>
+# SQL_CA2_MAX_ROWS_AFFECTS_ALL<BR>
+# SQL_CA2_CRC_EXACT<BR>
+# SQL_CA2_CRC_APPROXIMATE<BR>
+# SQL_CA2_SIMULATE_NON_UNIQUE<BR>
+# SQL_CA2_SIMULATE_TRY_UNIQUE<BR>
+# SQL_CA2_SIMULATE_UNIQUE </P>
+#
+# <P>For descriptions of these bitmasks, see SQL_DYNAMIC_CURSOR_ATTRIBUTES2 (and substitute "forward-only cursor" for "dynamic cursor" in the descriptions).</P>
+# </TD>
+# </TR>
+ SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2 => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_GETDATA_EXTENSIONS<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating extensions to <B>SQLGetData</B>.
+# <P>The following bitmasks are used in conjunction with the flag to determine what common extensions the driver supports for <B>SQLGetData</B>:</P>
+#
+# <P>SQL_GD_ANY_COLUMN = <B>SQLGetData</B> can be called for any unbound column, including those before the last bound column. Note that the columns must be called in order of ascending column number unless SQL_GD_ANY_ORDER is also returned.</P>
+#
+# <P>SQL_GD_ANY_ORDER = <B>SQLGetData</B> can be called for unbound columns in any order. Note that <B>SQLGetData</B> can be called only for columns after the last bound column unless SQL_GD_ANY_COLUMN is also returned.</P>
+#
+# <P>SQL_GD_BLOCK = <B>SQLGetData</B> can be called for an unbound column in any row in a block (where the rowset size is greater than 1) of data after positioning to that row with <B>SQLSetPos</B>.</P>
+#
+# <P>SQL_GD_BOUND = <B>SQLGetData</B> can be called for bound columns as well as unbound columns. A driver cannot return this value unless it also returns SQL_GD_ANY_COLUMN.</P>
+#
+# <P><B>SQLGetData</B> is required to return data only from unbound columns that occur after the last bound column, are called in order of increasing column number, and are not in a row in a block of rows.</P>
+#
+# <P>If a driver supports bookmarks (either fixed-length or variable-length), it must support calling <B>SQLGetData</B> on column 0. This support is required regardless of what the driver returns for a call to <B>SQLGetInfo</B> with the SQL_GETDATA_EXTENSIONS <I>InfoType</I>.</P>
+# </TD>
+# </TR>
+ SQL_GETDATA_EXTENSIONS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_GROUP_BY<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying the relationship between the columns in the <B>GROUP BY</B> clause and the nonaggregated columns in the select list:
+# <P>SQL_GB_COLLATE = A <B>COLLATE</B> clause can be specified at the end of each grouping column. (ODBC 3.0)</P>
+#
+# <P>SQL_GB_NOT_SUPPORTED = <B>GROUP BY</B> clauses are not supported. (ODBC 2.0)</P>
+#
+# <P>SQL_GB_GROUP_BY_EQUALS_SELECT = The <B>GROUP BY</B> clause must contain all nonaggregated columns in the select list. It cannot contain any other columns. For example, <B>SELECT DEPT, MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT</B>. (ODBC 2.0)</P>
+#
+# <P>SQL_GB_GROUP_BY_CONTAINS_SELECT = The <B>GROUP BY</B> clause must contain all nonaggregated columns in the select list. It can contain columns that are not in the select list. For example, <B>SELECT DEPT, MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT, AGE</B>. (ODBC 2.0)</P>
+#
+# <P>SQL_GB_NO_RELATION = The columns in the <B>GROUP BY</B> clause and the select list are not related. The meaning of nongrouped, nonaggregated columns in the select list is data source&#0150;dependent. For example, <B>SELECT DEPT, SALARY FROM EMPLOYEE GROUP BY DEPT, AGE</B>. (ODBC 2.0)</P>
+#
+# <P>An SQL-92 Entry level&#0150;conformant driver will always return the SQL_GB_GROUP_BY_EQUALS_SELECT option as supported. An SQL-92 Full level&#0150;conformant driver will always return the SQL_GB_COLLATE option as supported. If none of the options is supported, the <B>GROUP BY</B> clause is not supported by the data source.</P>
+# </TD>
+# </TR>
+ SQL_GROUP_BY => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_IDENTIFIER_CASE<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value as follows:
+# <P>SQL_IC_UPPER = Identifiers in SQL are not case-sensitive and are stored in uppercase in system catalog.</P>
+#
+# <P>SQL_IC_LOWER = Identifiers in SQL are not case-sensitive and are stored in lowercase in system catalog.</P>
+#
+# <P>SQL_IC_SENSITIVE = Identifiers in SQL are case-sensitive and are stored in mixed case in system catalog.</P>
+#
+# <P>SQL_IC_MIXED = Identifiers in SQL are not case-sensitive and are stored in mixed case in system catalog. </P>
+#
+# <P>Because identifiers in SQL-92 are never case-sensitive, a driver that conforms strictly to SQL-92 (any level) will never return the SQL_IC_SENSITIVE option as supported.</P>
+# </TD>
+# </TR>
+ SQL_IDENTIFIER_CASE => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_IDENTIFIER_QUOTE_CHAR<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>The character string used as the starting and ending delimiter of a quoted (delimited) identifier in SQL statements. (Identifiers passed as arguments to ODBC functions do not need to be quoted.) If the data source does not support quoted identifiers, a blank is returned.
+# <P>This character string can also be used for quoting catalog function arguments when the connection attribute SQL_ATTR_METADATA_ID is set to SQL_TRUE.</P>
+#
+# <P>Because the identifier quote character in SQL-92 is the double quotation mark ("), a driver that conforms strictly to SQL-92 will always return the double quotation mark character.</P>
+# </TD>
+# </TR>
+ SQL_IDENTIFIER_QUOTE_CHAR => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_INDEX_KEYWORDS<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask that enumerates keywords in the CREATE INDEX statement that are supported by the driver:
+# <P>SQL_IK_NONE = None of the keywords is supported.</P>
+#
+# <P>SQL_IK_ASC = ASC keyword is supported.</P>
+#
+# <P>SQL_IK_DESC = DESC keyword is supported.</P>
+#
+# <P>SQL_IK_ALL = All keywords are supported.</P>
+#
+# <P>To see if the CREATE INDEX statement is supported, an application calls <B>SQLGetInfo</B> with the SQL_DLL_INDEX information type.</P>
+# </TD>
+# </TR>
+ SQL_INDEX_KEYWORDS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_INFO_SCHEMA_VIEWS<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the views in the INFORMATION_SCHEMA that are supported by the driver. The views in, and the contents of, INFORMATION_SCHEMA are as defined in SQL-92.
+# <P>The SQL-92 or FIPS conformance level at which this feature needs to be supported is shown in parentheses next to each bitmask.</P>
+#
+# <P>The following bitmasks are used to determine which views are supported:</P>
+#
+# <P>SQL_ISV_ASSERTIONS = Identifies the catalog's assertions that are owned by a given user. (Full level)</P>
+#
+# <P>SQL_ISV_CHARACTER_SETS = Identifies the catalog's character sets that are accessible to a given user. (Intermediate level)</P>
+#
+# <P>SQL_ISV_CHECK_CONSTRAINTS = Identifies the CHECK constraints that are owned by a given user. (Intermediate level)</P>
+#
+# <P>SQL_ISV_COLLATIONS = Identifies the character collations for the catalog that are accessible to a given user. (Full level)</P>
+#
+# <P>SQL_ISV_COLUMN_DOMAIN_USAGE = Identifies columns for the catalog that are dependent on domains defined in the catalog and are owned by a given user. (Intermediate level)</P>
+#
+# <P>SQL_ISV_COLUMN_PRIVILEGES = Identifies the privileges on columns of persistent tables that are available to or granted by a given user. (FIPS Transitional level)</P>
+#
+# <P>SQL_ISV_COLUMNS = Identifies the columns of persistent tables that are accessible to a given user. (FIPS Transitional level)</P>
+#
+# <P>SQL_ISV_CONSTRAINT_COLUMN_USAGE = Similar to CONSTRAINT_TABLE_USAGE view, columns are identified for the various constraints that are owned by a given user. (Intermediate level)</P>
+#
+# <P>SQL_ISV_CONSTRAINT_TABLE_USAGE = Identifies the tables that are used by constraints (referential, unique, and assertions), and are owned by a given user. (Intermediate level)</P>
+#
+# <P>SQL_ISV_DOMAIN_CONSTRAINTS = Identifies the domain constraints (of the domains in the catalog) that are accessible to a given user. (Intermediate level)</P>
+#
+# <P>SQL_ISV_DOMAINS = Identifies the domains defined in a catalog that are accessible to the user. (Intermediate level)</P>
+#
+# <P>SQL_ISV_KEY_COLUMN_USAGE = Identifies columns defined in the catalog that are constrained as keys by a given user. (Intermediate level)</P>
+#
+# <P>SQL_ISV_REFERENTIAL_CONSTRAINTS = Identifies the referential constraints that are owned by a given user. (Intermediate level)</P>
+#
+# <P>SQL_ISV_SCHEMATA = Identifies the schemas that are owned by a given user. (Intermediate level)</P>
+#
+# <P>SQL_ISV_SQL_LANGUAGES = Identifies the SQL conformance levels, options, and dialects supported by the SQL implementation. (Intermediate level)</P>
+#
+# <P>SQL_ISV_TABLE_CONSTRAINTS = Identifies the table constraints that are owned by a given user. (Intermediate level)</P>
+#
+# <P>SQL_ISV_TABLE_PRIVILEGES = Identifies the privileges on persistent tables that are available to or granted by a given user. (FIPS Transitional level)</P>
+#
+# <P>SQL_ISV_TABLES = Identifies the persistent tables defined in a catalog that are accessible to a given user. (FIPS Transitional level)</P>
+#
+# <P>SQL_ISV_TRANSLATIONS = Identifies character translations for the catalog that are accessible to a given user. (Full level) </P>
+#
+# <P>SQL_ISV_USAGE_PRIVILEGES = Identifies the USAGE privileges on catalog objects that are available to or owned by a given user. (FIPS Transitional level)</P>
+#
+# <P>SQL_ISV_VIEW_COLUMN_USAGE = Identifies the columns on which the catalog's views that are owned by a given user are dependent. (Intermediate level)</P>
+#
+# <P>SQL_ISV_VIEW_TABLE_USAGE = Identifies the tables on which the catalog's views that are owned by a given user are dependent. (Intermediate level) </P>
+#
+# <P>SQL_ISV_VIEWS = Identifies the viewed tables defined in this catalog that are accessible to a given user. (FIPS Transitional level)</P>
+# </TD>
+# </TR>
+ SQL_INFO_SCHEMA_VIEWS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_INSERT_STATEMENT<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask that indicates support for <B>INSERT</B> statements:
+# <P>SQL_IS_INSERT_LITERALS</P>
+#
+# <P>SQL_IS_INSERT_SEARCHED</P>
+#
+# <P>SQL_IS_SELECT_INTO </P>
+#
+# <P>An SQL-92 Entry level&#0150;conformant driver will always return all of these options as supported.</P>
+# </TD>
+# </TR>
+ SQL_INSERT_STATEMENT => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_INTEGRITY<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string: "Y" if the data source supports the Integrity Enhancement Facility; "N" if it does not.
+# <P>This <I>InfoType</I> has been renamed for ODBC 3.0 from the ODBC 2.0 <I>InfoType</I> SQL_ODBC_SQL_OPT_IEF.</P>
+# </TD>
+# </TR>
+ SQL_INTEGRITY => {
+ type => q(YesNo),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_KEYSET_CURSOR_ATTRIBUTES1<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask that describes the attributes of a keyset cursor that are supported by the driver. This bitmask contains the first subset of attributes; for the second subset, see SQL_KEYSET_CURSOR_ATTRIBUTES2.
+# <P>The following bitmasks are used to determine which attributes are supported: </P>
+#
+# <P>SQL_CA1_NEXT<BR>
+# SQL_CA1_ABSOLUTE<BR>
+# SQL_CA1_RELATIVE<BR>
+# SQL_CA1_BOOKMARK<BR>
+# SQL_CA1_LOCK_EXCLUSIVE<BR>
+# SQL_CA1_LOCK_NO_CHANGE<BR>
+# SQL_CA1_LOCK_UNLOCK<BR>
+# SQL_CA1_POS_POSITION<BR>
+# SQL_CA1_POS_UPDATE<BR>
+# SQL_CA1_POS_DELETE<BR>
+# SQL_CA1_POS_REFRESH<BR>
+# SQL_CA1_POSITIONED_UPDATE<BR>
+# SQL_CA1_POSITIONED_DELETE<BR>
+# SQL_CA1_SELECT_FOR_UPDATE<BR>
+# SQL_CA1_BULK_ADD<BR>
+# SQL_CA1_BULK_UPDATE_BY_BOOKMARK<BR>
+# SQL_CA1_BULK_DELETE_BY_BOOKMARK<BR>
+# SQL_CA1_BULK_FETCH_BY_BOOKMARK</P>
+#
+# <P>For descriptions of these bitmasks, see SQL_DYNAMIC_CURSOR_ATTRIBUTES1 (and substitute "keyset-driven cursor" for "dynamic cursor" in the descriptions).</P>
+#
+# <P>An SQL-92 Intermediate level&#0150;conformant driver will usually return the SQL_CA1_NEXT, SQL_CA1_ABSOLUTE, and SQL_CA1_RELATIVE options as supported, because the driver supports scrollable cursors through the embedded SQL FETCH statement. Because this does not directly determine the underlying SQL support, however, scrollable cursors may not be supported, even for an SQL-92 Intermediate level&#0150;conformant driver.</P>
+# </TD>
+# </TR>
+ SQL_KEYSET_CURSOR_ATTRIBUTES1 => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_KEYSET_CURSOR_ATTRIBUTES2<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask that describes the attributes of a keyset cursor that are supported by the driver. This bitmask contains the second subset of attributes; for the first subset, see SQL_KEYSET_CURSOR_ATTRIBUTES1.
+# <P>The following bitmasks are used to determine which attributes are supported:</P>
+#
+# <P>SQL_CA2_READ_ONLY_CONCURRENCY<BR>
+# SQL_CA2_LOCK_CONCURRENCY<BR>
+# SQL_CA2_OPT_ROWVER_CONCURRENCY<BR>
+# SQL_CA2_OPT_VALUES_CONCURRENCY<BR>
+# SQL_CA2_SENSITIVITY_ADDITIONS<BR>
+# SQL_CA2_SENSITIVITY_DELETIONS<BR>
+# SQL_CA2_SENSITIVITY_UPDATES<BR>
+# SQL_CA2_MAX_ROWS_SELECT<BR>
+# SQL_CA2_MAX_ROWS_INSERT<BR>
+# SQL_CA2_MAX_ROWS_DELETE<BR>
+# SQL_CA2_MAX_ROWS_UPDATE<BR>
+# SQL_CA2_MAX_ROWS_CATALOG<BR>
+# SQL_CA2_MAX_ROWS_AFFECTS_ALL<BR>
+# SQL_CA2_CRC_EXACT<BR>
+# SQL_CA2_CRC_APPROXIMATE<BR>
+# SQL_CA2_SIMULATE_NON_UNIQUE<BR>
+# SQL_CA2_SIMULATE_TRY_UNIQUE<BR>
+# SQL_CA2_SIMULATE_UNIQUE</P>
+#
+# <P>For descriptions of these bitmasks, see SQL_DYNAMIC_CURSOR_ATTRIBUTES1 (and substitute "keyset-driven cursor" for "dynamic cursor" in the descriptions).</P>
+# </TD>
+# </TR>
+ SQL_KEYSET_CURSOR_ATTRIBUTES2 => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_KEYWORDS<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>A character string containing a comma-separated list of all data source&#0150;specific keywords. This list does not contain keywords specific to ODBC or keywords used by both the data source and ODBC. This list represents all the reserved keywords; interoperable applications should not use these words in object names.
+# <P>For a list of ODBC keywords, see "<A HREF="odbclist_of_reserved_keywords.htm">List of Reserved Keywords</A>" in Appendix C, "SQL Grammar." The <B>#define</B> value SQL_ODBC_KEYWORDS contains a comma-separated list of ODBC keywords.</P>
+# </TD>
+# </TR>
+ SQL_KEYWORDS => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_LIKE_ESCAPE_CLAUSE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>A character string: "Y" if the data source supports an escape character for the percent character (%) and underscore character (_) in a <B>LIKE</B> predicate and the driver supports the ODBC syntax for defining a <B>LIKE</B> predicate escape character; "N" otherwise.</TD>
+# </TR>
+ SQL_LIKE_ESCAPE_CLAUSE => {
+ type => q(YesNo),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_ASYNC_CONCURRENT_STATEMENTS<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER value specifying the maximum number of active concurrent statements in asynchronous mode that the driver can support on a given connection. If there is no specific limit or the limit is unknown, this value is zero.</TD>
+# </TR>
+ SQL_MAX_ASYNC_CONCURRENT_STATEMENTS => {
+ type => q(Long),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_BINARY_LITERAL_LEN<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUINTEGER value specifying the maximum length (number of hexadecimal characters, excluding the literal prefix and suffix returned by <B>SQLGetTypeInfo</B>) of a binary literal in an SQL statement. For example, the binary literal 0xFFAA has a length of 4. If there is no maximum length or the length is unknown, this value is set to zero.</TD>
+# </TR>
+ SQL_MAX_BINARY_LITERAL_LEN => {
+ type => q(Long),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_CATALOG_NAME_LEN<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying the maximum length of a catalog name in the data source. If there is no maximum length or the length is unknown, this value is set to zero.
+# <P>An FIPS Full level&#0150;conformant driver will return at least 128.</P>
+#
+# <P>This <I>InfoType</I> has been renamed for ODBC 3.0 from the ODBC 2.0 <I>InfoType</I> SQL_MAX_QUALIFIER_NAME_LEN.</P>
+# </TD>
+# </TR>
+ SQL_MAX_CATALOG_NAME_LEN => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_CHAR_LITERAL_LEN<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUINTEGER value specifying the maximum length (number of characters, excluding the literal prefix and suffix returned by <B>SQLGetTypeInfo</B>) of a character literal in an SQL statement. If there is no maximum length or the length is unknown, this value is set to zero.</TD>
+# </TR>
+ SQL_MAX_CHAR_LITERAL_LEN => {
+ type => q(Long),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_COLUMN_NAME_LEN<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying the maximum length of a column name in the data source. If there is no maximum length or the length is unknown, this value is set to zero.
+# <P>An FIPS Entry level&#0150;conformant driver will return at least 18. An FIPS Intermediate level&#0150;conformant driver will return at least 128.</P>
+# </TD>
+# </TR>
+ SQL_MAX_COLUMN_NAME_LEN => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_COLUMNS_IN_GROUP_BY<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying the maximum number of columns allowed in a <B>GROUP BY</B> clause. If there is no specified limit or the limit is unknown, this value is set to zero.
+# <P>An FIPS Entry level&#0150;conformant driver will return at least 6. An FIPS Intermediate level&#0150;conformant driver will return at least 15.</P>
+# </TD>
+# </TR>
+ SQL_MAX_COLUMNS_IN_GROUP_BY => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_COLUMNS_IN_INDEX<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying the maximum number of columns allowed in an index. If there is no specified limit or the limit is unknown, this value is set to zero.</TD>
+# </TR>
+ SQL_MAX_COLUMNS_IN_INDEX => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_COLUMNS_IN_ORDER_BY<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying the maximum number of columns allowed in an <B>ORDER BY</B> clause. If there is no specified limit or the limit is unknown, this value is set to zero.
+# <P>An FIPS Entry level&#0150;conformant driver will return at least 6. An FIPS Intermediate level&#0150;conformant driver will return at least 15.</P>
+# </TD>
+# </TR>
+ SQL_MAX_COLUMNS_IN_ORDER_BY => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_COLUMNS_IN_SELECT<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying the maximum number of columns allowed in a select list. If there is no specified limit or the limit is unknown, this value is set to zero.
+# <P>An FIPS Entry level&#0150;conformant driver will return at least 100. An FIPS Intermediate level&#0150;conformant driver will return at least 250.</P>
+# </TD>
+# </TR>
+ SQL_MAX_COLUMNS_IN_SELECT => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_COLUMNS_IN_TABLE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying the maximum number of columns allowed in a table. If there is no specified limit or the limit is unknown, this value is set to zero.
+# <P>An FIPS Entry level&#0150;conformant driver will return at least 100. An FIPS Intermediate level&#0150;conformant driver will return at least 250.</P>
+# </TD>
+# </TR>
+ SQL_MAX_COLUMNS_IN_TABLE => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_CONCURRENT_ACTIVITIES<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying the maximum number of active statements that the driver can support for a connection. A statement is defined as active if it has results pending, with the term "results" meaning rows from a <B>SELECT</B> operation or rows affected by an <B>INSERT</B>, <B>UPDATE</B>, or <B>DELETE</B> operation (such as a row count), or if it is in a NEED_DATA state. This value can reflect a limitation imposed by either the driver or the data source. If there is no specified limit or the limit is unknown, this value is set to zero.
+# <P>This <I>InfoType</I> has been renamed for ODBC 3.0 from the ODBC 2.0 <I>InfoType</I> SQL_ACTIVE_STATEMENTS.</P>
+# </TD>
+# </TR>
+ SQL_MAX_CONCURRENT_ACTIVITIES => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_CURSOR_NAME_LEN<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying the maximum length of a cursor name in the data source. If there is no maximum length or the length is unknown, this value is set to zero.
+# <P>An FIPS Entry level&#0150;conformant driver will return at least 18. An FIPS Intermediate level&#0150;conformant driver will return at least 128.</P>
+# </TD>
+# </TR>
+ SQL_MAX_CURSOR_NAME_LEN => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_DRIVER_CONNECTIONS<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying the maximum number of active connections that the driver can support for an environment. This value can reflect a limitation imposed by either the driver or the data source. If there is no specified limit or the limit is unknown, this value is set to zero.
+# <P>This <I>InfoType</I> has been renamed for ODBC 3.0 from the ODBC 2.0 <I>InfoType</I> SQL_ACTIVE_CONNECTIONS.</P>
+# </TD>
+# </TR>
+ SQL_MAX_DRIVER_CONNECTIONS => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_IDENTIFIER_LEN<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUSMALLINT that indicates the maximum size in characters that the data source supports for user-defined names.
+# <P>An FIPS Entry level&#0150;conformant driver will return at least 18. An FIPS Intermediate level&#0150;conformant driver will return at least 128.</P>
+# </TD>
+# </TR>
+ SQL_MAX_IDENTIFIER_LEN => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_INDEX_SIZE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUINTEGER value specifying the maximum number of bytes allowed in the combined fields of an index. If there is no specified limit or the limit is unknown, this value is set to zero.</TD>
+# </TR>
+ SQL_MAX_INDEX_SIZE => {
+ type => q(Long),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_PROCEDURE_NAME_LEN<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying the maximum length of a procedure name in the data source. If there is no maximum length or the length is unknown, this value is set to zero.</TD>
+# </TR>
+ SQL_MAX_PROCEDURE_NAME_LEN => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_ROW_SIZE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUINTEGER value specifying the maximum length of a single row in a table. If there is no specified limit or the limit is unknown, this value is set to zero.
+# <P>An FIPS Entry level&#0150;conformant driver will return at least 2,000. An FIPS Intermediate level&#0150;conformant driver will return at least 8,000.</P>
+# </TD>
+# </TR>
+ SQL_MAX_ROW_SIZE => {
+ type => q(Long),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_ROW_SIZE_INCLUDES_LONG<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>A character string: "Y" if the maximum row size returned for the SQL_MAX_ROW_SIZE information type includes the length of all SQL_LONGVARCHAR and SQL_LONGVARBINARY columns in the row; "N" otherwise.</TD>
+# </TR>
+ SQL_MAX_ROW_SIZE_INCLUDES_LONG => {
+ type => q(YesNo),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_SCHEMA_NAME_LEN<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying the maximum length of a schema name in the data source. If there is no maximum length or the length is unknown, this value is set to zero.
+# <P>An FIPS Entry level&#0150;conformant driver will return at least 18. An FIPS Intermediate level&#0150;conformant driver will return at least 128.</P>
+#
+# <P>This <I>InfoType</I> has been renamed for ODBC 3.0 from the ODBC 2.0 <I>InfoType</I> SQL_MAX_OWNER_NAME_LEN.</P>
+# </TD>
+# </TR>
+ SQL_MAX_SCHEMA_NAME_LEN => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_STATEMENT_LEN<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUINTEGER value specifying the maximum length (number of characters, including white space) of an SQL statement. If there is no maximum length or the length is unknown, this value is set to zero.</TD>
+# </TR>
+ SQL_MAX_STATEMENT_LEN => {
+ type => q(Long),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_TABLE_NAME_LEN<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying the maximum length of a table name in the data source. If there is no maximum length or the length is unknown, this value is set to zero.
+# <P>An FIPS Entry level&#0150;conformant driver will return at least 18. An FIPS Intermediate level&#0150;conformant driver will return at least 128.</P>
+# </TD>
+# </TR>
+ SQL_MAX_TABLE_NAME_LEN => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_TABLES_IN_SELECT<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying the maximum number of tables allowed in the <B>FROM</B> clause of a <B>SELECT </B>statement. If there is no specified limit or the limit is unknown, this value is set to zero.
+# <P>An FIPS Entry level&#0150;conformant driver will return at least 15. An FIPS Intermediate level&#0150;conformant driver will return at least 50.</P>
+# </TD>
+# </TR>
+ SQL_MAX_TABLES_IN_SELECT => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MAX_USER_NAME_LEN<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying the maximum length of a user name in the data source. If there is no maximum length or the length is unknown, this value is set to zero.</TD>
+# </TR>
+ SQL_MAX_USER_NAME_LEN => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MULT_RESULT_SETS<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string: "Y" if the data source supports multiple result sets, "N" if it does not.
+# <P>For more information on multiple result sets, see "<A HREF="odbcmultiple_results.htm">Multiple Results</A>" in Chapter 11: Retrieving Results (Advanced).</P>
+# </TD>
+# </TR>
+ SQL_MULT_RESULT_SETS => {
+ type => q(YesNo),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_MULTIPLE_ACTIVE_TXN<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string: "Y" if the driver supports more than one active transaction at the same time, "N" if only one transaction can be active at any time.
+# <P>The information returned for this information type does not apply in the case of distributed transactions.</P>
+# </TD>
+# </TR>
+ SQL_MULTIPLE_ACTIVE_TXN => {
+ type => q(YesNo),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_NEED_LONG_DATA_LEN<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>A character string: "Y" if the data source needs the length of a long data value (the data type is SQL_LONGVARCHAR, SQL_LONGVARBINARY, or a long data source&#0150;specific data type) before that value is sent to the data source, "N" if it does not. For more information, see <B>SQLBindParameter</B> and <B>SQLSetPos</B>.</TD>
+# </TR>
+ SQL_NEED_LONG_DATA_LEN => {
+ type => q(YesNo),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_NON_NULLABLE_COLUMNS<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying whether the data source supports NOT NULL in columns:
+# <P>SQL_NNC_NULL = All columns must be nullable.</P>
+#
+# <P>SQL_NNC_NON_NULL = Columns cannot be nullable. (The data source supports the <B>NOT NULL</B> column constraint in <B>CREATE TABLE</B> statements.) </P>
+#
+# <P>An SQL-92 Entry level&#0150;conformant driver will return SQL_NNC_NON_NULL.</P>
+# </TD>
+# </TR>
+ SQL_NON_NULLABLE_COLUMNS => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_NULL_COLLATION<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value specifying where NULLs are sorted in a result set:
+# <P>SQL_NC_END = NULLs are sorted at the end of the result set, regardless of the ASC or DESC keywords.</P>
+#
+# <P>SQL_NC_HIGH = NULLs are sorted at the high end of the result set, depending on the ASC or DESC keywords.</P>
+#
+# <P>SQL_NC_LOW = NULLs are sorted at the low end of the result set, depending on the ASC or DESC keywords.</P>
+#
+# <P>SQL_NC_START = NULLs are sorted at the start of the result set, regardless of the ASC or DESC keywords.</P>
+# </TD>
+# </TR>
+ SQL_NULL_COLLATION => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_NUMERIC_FUNCTIONS<BR>
+# (ODBC 1.0)
+# <P>The information type was introduced in ODBC 1.0; each bitmask is labeled with the version in which it was introduced.</P>
+# </TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the scalar numeric functions supported by the driver and associated data source.
+# <P>The following bitmasks are used to determine which numeric functions are supported:</P>
+#
+# <P>SQL_FN_NUM_ABS (ODBC 1.0)<BR>
+# SQL_FN_NUM_ACOS (ODBC 1.0)<BR>
+# SQL_FN_NUM_ASIN (ODBC 1.0)<BR>
+# SQL_FN_NUM_ATAN (ODBC 1.0)<BR>
+# SQL_FN_NUM_ATAN2 (ODBC 1.0)<BR>
+# SQL_FN_NUM_CEILING (ODBC 1.0)<BR>
+# SQL_FN_NUM_COS (ODBC 1.0)<BR>
+# SQL_FN_NUM_COT (ODBC 1.0)<BR>
+# SQL_FN_NUM_DEGREES (ODBC 2.0)<BR>
+# SQL_FN_NUM_EXP (ODBC 1.0)<BR>
+# SQL_FN_NUM_FLOOR (ODBC 1.0)<BR>
+# SQL_FN_NUM_LOG (ODBC 1.0)<BR>
+# SQL_FN_NUM_LOG10 (ODBC 2.0)<BR>
+# SQL_FN_NUM_MOD (ODBC 1.0)<BR>
+# SQL_FN_NUM_PI (ODBC 1.0)<BR>
+# SQL_FN_NUM_POWER (ODBC 2.0)<BR>
+# SQL_FN_NUM_RADIANS (ODBC 2.0)<BR>
+# SQL_FN_NUM_RAND (ODBC 1.0)<BR>
+# SQL_FN_NUM_ROUND (ODBC 2.0)<BR>
+# SQL_FN_NUM_SIGN (ODBC 1.0)<BR>
+# SQL_FN_NUM_SIN (ODBC 1.0)<BR>
+# SQL_FN_NUM_SQRT (ODBC 1.0)<BR>
+# SQL_FN_NUM_TAN (ODBC 1.0)<BR>
+# SQL_FN_NUM_TRUNCATE (ODBC 2.0)</P>
+# </TD>
+# </TR>
+ SQL_NUMERIC_FUNCTIONS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ODBC_INTERFACE_CONFORMANCE<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER value indicating the level of the ODBC 3<I>.x</I> interface that the driver conforms to.
+# <P>SQL_OIC_CORE: The minimum level that all ODBC drivers are expected to conform to. This level includes basic interface elements such as connection functions, functions for preparing and executing an SQL statement, basic result set metadata functions, basic catalog functions, and so on.</P>
+#
+# <P>SQL_OIC_LEVEL1: A level including the core standards compliance level functionality, plus scrollable cursors, bookmarks, positioned updates and deletes, and so on.</P>
+#
+# <P>SQL_OIC_LEVEL2: A level including level 1 standards compliance level functionality, plus advanced features such as sensitive cursors; update, delete, and refresh by bookmarks; stored procedure support; catalog functions for primary and foreign keys; multicatalog support; and so on.</P>
+#
+# <P>For more information, see "<A HREF="odbcinterface_conformance_levels.htm">Interface Conformance Levels</A>" in Chapter 4: ODBC Fundamentals.</P>
+# </TD>
+# </TR>
+ SQL_ODBC_INTERFACE_CONFORMANCE => {
+ type => q(Long),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ODBC_VER<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string with the version of ODBC to which the Driver Manager conforms. The version is of the form ##.##.0000, where the first two digits are the major version and the next two digits are the minor version. This is implemented solely in the Driver Manager.</TD>
+# </TR>
+ SQL_ODBC_VER => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_OJ_CAPABILITIES<BR>
+# (ODBC 2.01)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the types of outer joins supported by the driver and data source. The following bitmasks are used to determine which types are supported:
+# <P>SQL_OJ_LEFT = Left outer joins are supported.</P>
+#
+# <P>SQL_OJ_RIGHT = Right outer joins are supported.</P>
+#
+# <P>SQL_OJ_FULL = Full outer joins are supported.</P>
+#
+# <P>SQL_OJ_NESTED = Nested outer joins are supported.</P>
+#
+# <P>SQL_OJ_NOT_ORDERED = The column names in the ON clause of the outer join do not have to be in the same order as their respective table names in the <B>OUTER JOIN </B>clause.</P>
+#
+# <P>SQL_OJ_INNER = The inner table (the right table in a left outer join or the left table in a right outer join) can also be used in an inner join. This does not apply to full outer joins, which do not have an inner table.</P>
+#
+# <P>SQL_OJ_ALL_COMPARISON_OPS = The comparison operator in the ON clause can be any of the ODBC comparison operators. If this bit is not set, only the equals (=) comparison operator can be used in outer joins.</P>
+#
+# <P>If none of these options is returned as supported, no outer join clause is supported.</P>
+#
+# <P>For information on the support of relational join operators in a SELECT statement, as defined by SQL-92, see SQL_SQL92_RELATIONAL_JOIN_OPERATORS.</P>
+# </TD>
+# </TR>
+ SQL_OJ_CAPABILITIES => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ORDER_BY_COLUMNS_IN_SELECT<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>A character string: "Y" if the columns in the <B>ORDER BY</B> clause must be in the select list; otherwise, "N".</TD>
+# </TR>
+ SQL_ORDER_BY_COLUMNS_IN_SELECT => {
+ type => q(YesNo),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_PARAM_ARRAY_ROW_COUNTS<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER enumerating the driver's properties regarding the availability of row counts in a parameterized execution. Has the following values:
+# <P>SQL_PARC_BATCH = Individual row counts are available for each set of parameters. This is conceptually equivalent to the driver generating a batch of SQL statements, one for each parameter set in the array. Extended error information can be retrieved by using the SQL_PARAM_STATUS_PTR descriptor field.</P>
+#
+# <P>SQL_PARC_NO_BATCH = There is only one row count available, which is the cumulative row count resulting from the execution of the statement for the entire array of parameters. This is conceptually equivalent to treating the statement along with the entire parameter array as one atomic unit. Errors are handled the same as if one statement were executed.</P>
+# </TD>
+# </TR>
+ SQL_PARAM_ARRAY_ROW_COUNTS => {
+ type => q(Long),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_PARAM_ARRAY_SELECTS<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER enumerating the driver's properties regarding the availability of result sets in a parameterized execution. Has the following values:
+# <P>SQL_PAS_BATCH = There is one result set available per set of parameters. This is conceptually equivalent to the driver generating a batch of SQL statements, one for each parameter set in the array.</P>
+#
+# <P>SQL_PAS_NO_BATCH = There is only one result set available, which represents the cumulative result set resulting from the execution of the statement for the entire array of parameters. This is conceptually equivalent to treating the statement along with the entire parameter array as one atomic unit.</P>
+#
+# <P>SQL_PAS_NO_SELECT = A driver does not allow a result-set generating statement to be executed with an array of parameters.</P>
+# </TD>
+# </TR>
+ SQL_PARAM_ARRAY_SELECTS => {
+ type => q(Long),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_PROCEDURE_TERM<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string with the data source vendor's name for a procedure; for example, "database procedure", "stored procedure", "procedure", "package", or "stored query".</TD>
+# </TR>
+ SQL_PROCEDURE_TERM => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_PROCEDURES<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string: "Y" if the data source supports procedures and the driver supports the ODBC procedure invocation syntax; "N" otherwise.</TD>
+# </TR>
+ SQL_PROCEDURES => {
+ type => q(YesNo),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_POS_OPERATIONS (ODBC 2.0)</TD>
+# <TD width=50%>An SQLINTEGER bitmask enumerating the support operations in <B>SQLSetPos</B>.
+# <P>The following bitmasks are used in conjunction with the flag to determine which options are supported.</P>
+#
+# <P>SQL_POS_POSITION (ODBC 2.0) SQL_POS_REFRESH (ODBC 2.0) SQL_POS_UPDATE (ODBC 2.0) SQL_POS_DELETE (ODBC 2.0) SQL_POS_ADD (ODBC 2.0) </P>
+# </TD>
+# </TR>
+ SQL_POS_OPERATIONS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_QUOTED_IDENTIFIER_CASE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUSMALLINT value as follows:
+# <P>SQL_IC_UPPER = Quoted identifiers in SQL are not case-sensitive and are stored in uppercase in the system catalog.</P>
+#
+# <P>SQL_IC_LOWER = Quoted identifiers in SQL are not case-sensitive and are stored in lowercase in the system catalog.</P>
+#
+# <P>SQL_IC_SENSITIVE = Quoted identifiers in SQL are case-sensitive and are stored in mixed case in the system catalog. (In an SQL-92&#0150;compliant database, quoted identifiers are always case-sensitive.)</P>
+#
+# <P>SQL_IC_MIXED = Quoted identifiers in SQL are not case-sensitive and are stored in mixed case in the system catalog.</P>
+#
+# <P>An SQL-92 Entry level&#0150;conformant driver will always return SQL_IC_SENSITIVE.</P>
+# </TD>
+# </TR>
+ SQL_QUOTED_IDENTIFIER_CASE => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ROW_UPDATES<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string: "Y" if a keyset-driven or mixed cursor maintains row versions or values for all fetched rows and therefore can detect any updates made to a row by any user since the row was last fetched. (This applies only to updates, not to deletions or insertions.) The driver can return the SQL_ROW_UPDATED flag to the row status array when <B>SQLFetchScroll</B> is called. Otherwise, "N".</TD>
+# </TR>
+ SQL_ROW_UPDATES => {
+ type => q(YesNo),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SCHEMA_TERM<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string with the data source vendor's name for an schema; for example, "owner", "Authorization ID", or "Schema".
+# <P>The character string can be returned in upper, lower, or mixed case.</P>
+#
+# <P>An SQL-92 Entry level&#0150;conformant driver will always return "schema".</P>
+#
+# <P>This <I>InfoType</I> has been renamed for ODBC 3.0 from the ODBC 2.0 <I>InfoType</I> SQL_OWNER_TERM.</P>
+# </TD>
+# </TR>
+ SQL_SCHEMA_TERM => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SCHEMA_USAGE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the statements in which schemas can be used:
+# <P>SQL_SU_DML_STATEMENTS = Schemas are supported in all Data Manipulation Language statements: <B>SELECT</B>, <B>INSERT</B>, <B>UPDATE</B>, <B>DELETE</B>, and if supported, <B>SELECT FOR UPDATE</B> and positioned update and delete statements.</P>
+#
+# <P>SQL_SU_PROCEDURE_INVOCATION = Schemas are supported in the ODBC procedure invocation statement.</P>
+#
+# <P>SQL_SU_TABLE_DEFINITION = Schemas are supported in all table definition statements: <B>CREATE TABLE</B>, <B>CREATE VIEW</B>, <B>ALTER TABLE</B>, <B>DROP TABLE</B>, and <B>DROP VIEW</B>.</P>
+#
+# <P>SQL_SU_INDEX_DEFINITION = Schemas are supported in all index definition statements: <B>CREATE INDEX</B> and <B>DROP INDEX</B>.</P>
+#
+# <P>SQL_SU_PRIVILEGE_DEFINITION = Schemas are supported in all privilege definition statements: <B>GRANT</B> and <B>REVOKE</B>. </P>
+#
+# <P>An SQL-92 Entry level&#0150;conformant driver will always return the SQL_SU_DML_STATEMENTS, SQL_SU_TABLE_DEFINITION, and SQL_SU_PRIVILEGE_DEFINITION options, as supported.</P>
+#
+# <P>This <I>InfoType</I> has been renamed for ODBC 3.0 from the ODBC 2.0 <I>InfoType</I> SQL_OWNER_USAGE.</P>
+# </TD>
+# </TR>
+ SQL_SCHEMA_USAGE => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SCROLL_OPTIONS<BR>
+# (ODBC 1.0)
+# <P>The information type was introduced in ODBC 1.0; each bitmask is labeled with the version in which it was introduced.</P>
+# </TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the scroll options supported for scrollable cursors.
+# <P>The following bitmasks are used to determine which options are supported:</P>
+#
+# <P>SQL_SO_FORWARD_ONLY = The cursor only scrolls forward. (ODBC 1.0)</P>
+#
+# <P>SQL_SO_STATIC = The data in the result set is static. (ODBC 2.0)</P>
+#
+# <P>SQL_SO_KEYSET_DRIVEN = The driver saves and uses the keys for every row in the result set. (ODBC 1.0)</P>
+#
+# <P>SQL_SO_DYNAMIC = The driver keeps the keys for every row in the rowset (the keyset size is the same as the rowset size). (ODBC 1.0)</P>
+#
+# <P>SQL_SO_MIXED = The driver keeps the keys for every row in the keyset, and the keyset size is greater than the rowset size. The cursor is keyset-driven inside the keyset and dynamic outside the keyset. (ODBC 1.0)</P>
+#
+# <P>For information about scrollable cursors, see "<A HREF="odbcscrollable_cursors.htm">Scrollable Cursors</A>" in Chapter 11: Retrieving Results (Advanced)</P>
+# </TD>
+# </TR>
+ SQL_SCROLL_OPTIONS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SEARCH_PATTERN_ESCAPE<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string specifying what the driver supports as an escape character that permits the use of the pattern match metacharacters underscore (_) and percent sign (%) as valid characters in search patterns. This escape character applies only for those catalog function arguments that support search strings. If this string is empty, the driver does not support a search-pattern escape character.
+# <P>Because this information type does not indicate general support of the escape character in the <B>LIKE</B> predicate, SQL-92 does not include requirements for this character string.</P>
+#
+# <P>This <I>InfoType</I> is limited to catalog functions. For a description of the use of the escape character in search pattern strings, see "<A HREF="odbcpattern_value_arguments.htm">Pattern Value Arguments</A>" in Chapter 7: Catalog Functions.</P>
+# </TD>
+# </TR>
+ SQL_SEARCH_PATTERN_ESCAPE => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SERVER_NAME<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string with the actual data source&#0150;specific server name; useful when a data source name is used during <B>SQLConnect</B>, <B>SQLDriverConnect</B>, and<B> SQLBrowseConnect</B>.</TD>
+# </TR>
+ SQL_SERVER_NAME => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SPECIAL_CHARACTERS<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>A character string containing all special characters (that is, all characters except a through z, A through Z, 0 through 9, and underscore) that can be used in an identifier name, such as a table name, column column name, or index name, on the data source. For example, "#$^". If an identifier contains one or more of these characters, the identifier must be a delimited identifier.</TD>
+# </TR>
+ SQL_SPECIAL_CHARACTERS => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SQL_CONFORMANCE<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER value indicating the level of SQL-92 supported by the driver:
+# <P>SQL_SC_SQL92_ENTRY = Entry level SQL-92 compliant.</P>
+#
+# <P>SQL_SC_FIPS127_2_TRANSITIONAL = FIPS 127-2 transitional level compliant.</P>
+#
+# <P>SQL_SC_SQL92_FULL = Full level SQL-92 compliant.</P>
+#
+# <P>SQL_SC_ SQL92_INTERMEDIATE = Intermediate level SQL-92 compliant.</P>
+# </TD>
+# </TR>
+ SQL_SQL_CONFORMANCE => {
+ type => q(Long),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SQL92_DATETIME_FUNCTIONS<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the datetime scalar functions that are supported by the driver and the associated data source, as defined in SQL-92.
+# <P>The following bitmasks are used to determine which datetime functions are supported:</P>
+#
+# <P>SQL_SDF_CURRENT_DATE<BR>
+# SQL_SDF_CURRENT_TIME<BR>
+# SQL_SDF_CURRENT_TIMESTAMP</P>
+# </TD>
+# </TR>
+ SQL_SQL92_DATETIME_FUNCTIONS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SQL92_FOREIGN_KEY_DELETE_RULE<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the rules supported for a foreign key in a <B>DELETE</B> statement, as defined in SQL-92.
+# <P>The following bitmasks are used to determine which clauses are supported by the data source:</P>
+#
+# <P>SQL_SFKD_CASCADE<BR>
+# SQL_SFKD_NO_ACTION<BR>
+# SQL_SFKD_SET_DEFAULT<BR>
+# SQL_SFKD_SET_NULL</P>
+#
+# <P>An FIPS Transitional level&#0150;conformant driver will always return all of these options as supported.</P>
+# </TD>
+# </TR>
+ SQL_SQL92_FOREIGN_KEY_DELETE_RULE => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SQL92_FOREIGN_KEY_UPDATE_RULE<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the rules supported for a foreign key in an <B>UPDATE</B> statement, as defined in SQL-92.
+# <P>The following bitmasks are used to determine which clauses are supported by the data source:</P>
+#
+# <P>SQL_SFKU_CASCADE<BR>
+# SQL_SFKU_NO_ACTION<BR>
+# SQL_SFKU_SET_DEFAULT<BR>
+# SQL_SFKU_SET_NULL </P>
+#
+# <P>An SQL-92 Full level&#0150;conformant driver will always return all of these options as supported.</P>
+# </TD>
+# </TR>
+ SQL_SQL92_FOREIGN_KEY_UPDATE_RULE => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SQL92_GRANT<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses supported in the <B>GRANT</B> statement, as defined in SQL-92.
+# <P>The SQL-92 or FIPS conformance level at which this feature needs to be supported is shown in parentheses next to each bitmask.</P>
+#
+# <P>The following bitmasks are used to determine which clauses are supported by the data source:</P>
+#
+# <P>SQL_SG_DELETE_TABLE (Entry level)<BR>
+# SQL_SG_INSERT_COLUMN (Intermediate level)<BR>
+# SQL_SG_INSERT_TABLE (Entry level) <BR>
+# SQL_SG_REFERENCES_TABLE (Entry level)<BR>
+# SQL_SG_REFERENCES_COLUMN (Entry level)<BR>
+# SQL_SG_SELECT_TABLE (Entry level)<BR>
+# SQL_SG_UPDATE_COLUMN (Entry level)<BR>
+# SQL_SG_UPDATE_TABLE (Entry level) <BR>
+# SQL_SG_USAGE_ON_DOMAIN (FIPS Transitional level)<BR>
+# SQL_SG_USAGE_ON_CHARACTER_SET (FIPS Transitional level)<BR>
+# SQL_SG_USAGE_ON_COLLATION (FIPS Transitional level)<BR>
+# SQL_SG_USAGE_ON_TRANSLATION (FIPS Transitional level)<BR>
+# SQL_SG_WITH_GRANT_OPTION (Entry level)</P>
+# </TD>
+# </TR>
+ SQL_SQL92_GRANT => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SQL92_NUMERIC_VALUE_FUNCTIONS<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the numeric value scalar functions that are supported by the driver and the associated data source, as defined in SQL-92.
+# <P>The following bitmasks are used to determine which numeric functions are supported:</P>
+#
+# <P>SQL_SNVF_BIT_LENGTH<BR>
+# SQL_SNVF_CHAR_LENGTH<BR>
+# SQL_SNVF_CHARACTER_LENGTH<BR>
+# SQL_SNVF_EXTRACT<BR>
+# SQL_SNVF_OCTET_LENGTH<BR>
+# SQL_SNVF_POSITION</P>
+# </TD>
+# </TR>
+ SQL_SQL92_NUMERIC_VALUE_FUNCTIONS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SQL92_PREDICATES<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the predicates supported in a <B>SELECT</B> statement, as defined in SQL-92.
+# <P>The SQL-92 or FIPS conformance level at which this feature needs to be supported is shown in parentheses next to each bitmask.</P>
+#
+# <P>The following bitmasks are used to determine which options are supported by the data source:</P>
+#
+# <P>SQL_SP_BETWEEN (Entry level)<BR>
+# SQL_SP_COMPARISON (Entry level)<BR>
+# SQL_SP_EXISTS (Entry level)<BR>
+# SQL_SP_IN (Entry level)<BR>
+# SQL_SP_ISNOTNULL (Entry level)<BR>
+# SQL_SP_ISNULL (Entry level)<BR>
+# SQL_SP_LIKE (Entry level)<BR>
+# SQL_SP_MATCH_FULL (Full level)<BR>
+# SQL_SP_MATCH_PARTIAL(Full level)<BR>
+# SQL_SP_MATCH_UNIQUE_FULL (Full level)<BR>
+# SQL_SP_MATCH_UNIQUE_PARTIAL (Full level)<BR>
+# SQL_SP_OVERLAPS (FIPS Transitional level)<BR>
+# SQL_SP_QUANTIFIED_COMPARISON (Entry level)<BR>
+# SQL_SP_UNIQUE (Entry level)</P>
+# </TD>
+# </TR>
+ SQL_SQL92_PREDICATES => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SQL92_RELATIONAL_JOIN_OPERATORS<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the relational join operators supported in a <B>SELECT</B> statement, as defined in SQL-92.
+# <P>The SQL-92 or FIPS conformance level at which this feature needs to be supported is shown in parentheses next to each bitmask.</P>
+#
+# <P>The following bitmasks are used to determine which options are supported by the data source:</P>
+#
+# <P>SQL_SRJO_CORRESPONDING_CLAUSE (Intermediate level)<BR>
+# SQL_SRJO_CROSS_JOIN (Full level)<BR>
+# SQL_SRJO_EXCEPT_JOIN (Intermediate level)<BR>
+# SQL_SRJO_FULL_OUTER_JOIN (Intermediate level) <BR>
+# SQL_SRJO_INNER_JOIN (FIPS Transitional level)<BR>
+# SQL_SRJO_INTERSECT_JOIN (Intermediate level)<BR>
+# SQL_SRJO_LEFT_OUTER_JOIN (FIPS Transitional level)<BR>
+# SQL_SRJO_NATURAL_JOIN (FIPS Transitional level)<BR>
+# SQL_SRJO_RIGHT_OUTER_JOIN (FIPS Transitional level)<BR>
+# SQL_SRJO_UNION_JOIN (Full level)</P>
+#
+# <P>SQL_SRJO_INNER_JOIN indicates support for the <B>INNER JOIN </B>syntax, not for the inner join capability. Support for the <B>INNER JOIN</B> syntax is FIPS TRANSITIONAL, while support for the inner join capability is <B>ENTRY</B>.</P>
+# </TD>
+# </TR>
+ SQL_SQL92_RELATIONAL_JOIN_OPERATORS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SQL92_REVOKE<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the clauses supported in the <B>REVOKE</B> statement, as defined in SQL-92, supported by the data source.
+# <P>The SQL-92 or FIPS conformance level at which this feature needs to be supported is shown in parentheses next to each bitmask.</P>
+#
+# <P>The following bitmasks are used to determine which clauses are supported by the data source:</P>
+#
+# <P>SQL_SR_CASCADE (FIPS Transitional level) <BR>
+# SQL_SR_DELETE_TABLE (Entry level)<BR>
+# SQL_SR_GRANT_OPTION_FOR (Intermediate level) <BR>
+# SQL_SR_INSERT_COLUMN (Intermediate level)<BR>
+# SQL_SR_INSERT_TABLE (Entry level)<BR>
+# SQL_SR_REFERENCES_COLUMN (Entry level)<BR>
+# SQL_SR_REFERENCES_TABLE (Entry level)<BR>
+# SQL_SR_RESTRICT (FIPS Transitional level)<BR>
+# SQL_SR_SELECT_TABLE (Entry level)<BR>
+# SQL_SR_UPDATE_COLUMN (Entry level)<BR>
+# SQL_SR_UPDATE_TABLE (Entry level)<BR>
+# SQL_SR_USAGE_ON_DOMAIN (FIPS Transitional level)<BR>
+# SQL_SR_USAGE_ON_CHARACTER_SET (FIPS Transitional level)<BR>
+# SQL_SR_USAGE_ON_COLLATION (FIPS Transitional level)<BR>
+# SQL_SR_USAGE_ON_TRANSLATION (FIPS Transitional level)</P>
+# </TD>
+# </TR>
+ SQL_SQL92_REVOKE => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SQL92_ROW_VALUE_CONSTRUCTOR<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the row value constructor expressions supported in a <B>SELECT</B> statement, as defined in SQL-92. The following bitmasks are used to determine which options are supported by the data source:
+# <P>SQL_SRVC_VALUE_EXPRESSION <BR>
+# SQL_SRVC_NULL <BR>
+# SQL_SRVC_DEFAULT <BR>
+# SQL_SRVC_ROW_SUBQUERY</P>
+# </TD>
+# </TR>
+ SQL_SQL92_ROW_VALUE_CONSTRUCTOR => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SQL92_STRING_FUNCTIONS<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the string scalar functions that are supported by the driver and the associated data source, as defined in SQL-92.
+# <P>The following bitmasks are used to determine which string functions are supported:</P>
+#
+# <P>SQL_SSF_CONVERT<BR>
+# SQL_SSF_LOWER<BR>
+# SQL_SSF_UPPER<BR>
+# SQL_SSF_SUBSTRING<BR>
+# SQL_SSF_TRANSLATE<BR>
+# SQL_SSF_TRIM_BOTH<BR>
+# SQL_SSF_TRIM_LEADING<BR>
+# SQL_SSF_TRIM_TRAILING</P>
+# </TD>
+# </TR>
+ SQL_SQL92_STRING_FUNCTIONS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SQL92_VALUE_EXPRESSIONS<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the value expressions supported, as defined in SQL-92.
+# <P>The SQL-92 or FIPS conformance level at which this feature needs to be supported is shown in parentheses next to each bitmask.</P>
+#
+# <P>The following bitmasks are used to determine which options are supported by the data source:</P>
+#
+# <P>SQL_SVE_CASE (Intermediate level)<BR>
+# SQL_SVE_CAST (FIPS Transitional level)<BR>
+# SQL_SVE_COALESCE (Intermediate level)<BR>
+# SQL_SVE_NULLIF (Intermediate level)</P>
+# </TD>
+# </TR>
+ SQL_SQL92_VALUE_EXPRESSIONS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_STANDARD_CLI_CONFORMANCE<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the CLI standard or standards to which the driver conforms. The following bitmasks are used to determine which levels the driver conforms to:
+# <P>SQL_SCC_XOPEN_CLI_VERSION1: The driver conforms to the X/Open CLI version 1.</P>
+#
+# <P>SQL_SCC_ISO92_CLI: The driver conforms to the ISO 92 CLI.</P>
+# </TD>
+# </TR>
+ SQL_STANDARD_CLI_CONFORMANCE => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_STATIC_CURSOR_ATTRIBUTES1<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask that describes the attributes of a static cursor that are supported by the driver. This bitmask contains the first subset of attributes; for the second subset, see SQL_STATIC_CURSOR_ATTRIBUTES2.
+# <P>The following bitmasks are used to determine which attributes are supported:</P>
+#
+# <P>SQL_CA1_NEXT<BR>
+# SQL_CA1_ABSOLUTE<BR>
+# SQL_CA1_RELATIVE<BR>
+# SQL_CA1_BOOKMARK<BR>
+# SQL_CA1_LOCK_NO_CHANGE<BR>
+# SQL_CA1_LOCK_EXCLUSIVE<BR>
+# SQL_CA1_LOCK_UNLOCK<BR>
+# SQL_CA1_POS_POSITION<BR>
+# SQL_CA1_POS_UPDATE<BR>
+# SQL_CA1_POS_DELETE<BR>
+# SQL_CA1_POS_REFRESH<BR>
+# SQL_CA1_POSITIONED_UPDATE<BR>
+# SQL_CA1_POSITIONED_DELETE<BR>
+# SQL_CA1_SELECT_FOR_UPDATE<BR>
+# SQL_CA1_BULK_ADD<BR>
+# SQL_CA1_BULK_UPDATE_BY_BOOKMARK<BR>
+# SQL_CA1_BULK_DELETE_BY_BOOKMARK<BR>
+# SQL_CA1_BULK_FETCH_BY_BOOKMARK</P>
+#
+# <P>For descriptions of these bitmasks, see SQL_DYNAMIC_CURSOR_ATTRIBUTES1 (and substitute "static cursor" for "dynamic cursor" in the descriptions).</P>
+#
+# <P>An SQL-92 Intermediate level&#0150;conformant driver will usually return the SQL_CA1_NEXT, SQL_CA1_ABSOLUTE, and SQL_CA1_RELATIVE options as supported, because the driver supports scrollable cursors through the embedded SQL FETCH statement. Because this does not directly determine the underlying SQL support, however, scrollable cursors may not be supported, even for an SQL-92 Intermediate level&#0150;conformant driver.</P>
+# </TD>
+# </TR>
+ SQL_STATIC_CURSOR_ATTRIBUTES1 => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_STATIC_CURSOR_ATTRIBUTES2<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask that describes the attributes of a static cursor that are supported by the driver. This bitmask contains the second subset of attributes; for the first subset, see SQL_STATIC_CURSOR_ATTRIBUTES1.
+# <P>The following bitmasks are used to determine which attributes are supported:</P>
+#
+# <P>SQL_CA2_READ_ONLY_CONCURRENCY<BR>
+# SQL_CA2_LOCK_CONCURRENCY<BR>
+# SQL_CA2_OPT_ROWVER_CONCURRENCY<BR>
+# SQL_CA2_OPT_VALUES_CONCURRENCY<BR>
+# SQL_CA2_SENSITIVITY_ADDITIONS<BR>
+# SQL_CA2_SENSITIVITY_DELETIONS<BR>
+# SQL_CA2_SENSITIVITY_UPDATES<BR>
+# SQL_CA2_MAX_ROWS_SELECT<BR>
+# SQL_CA2_MAX_ROWS_INSERT<BR>
+# SQL_CA2_MAX_ROWS_DELETE<BR>
+# SQL_CA2_MAX_ROWS_UPDATE<BR>
+# SQL_CA2_MAX_ROWS_CATALOG<BR>
+# SQL_CA2_MAX_ROWS_AFFECTS_ALL<BR>
+# SQL_CA2_CRC_EXACT<BR>
+# SQL_CA2_CRC_APPROXIMATE<BR>
+# SQL_CA2_SIMULATE_NON_UNIQUE<BR>
+# SQL_CA2_SIMULATE_TRY_UNIQUE<BR>
+# SQL_CA2_SIMULATE_UNIQUE</P>
+#
+# <P>For descriptions of these bitmasks, see SQL_DYNAMIC_CURSOR_ATTRIBUTES2 (and substitute "static cursor" for "dynamic cursor" in the descriptions).</P>
+# </TD>
+# </TR>
+ SQL_STATIC_CURSOR_ATTRIBUTES2 => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_STRING_FUNCTIONS<BR>
+# (ODBC 1.0)
+# <P>The information type was introduced in ODBC 1.0; each bitmask is labeled with the version in which it was introduced.</P>
+# </TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the scalar string functions supported by the driver and associated data source.
+# <P>The following bitmasks are used to determine which string functions are supported:</P>
+#
+# <P>SQL_FN_STR_ASCII (ODBC 1.0)<BR>
+# SQL_FN_STR_BIT_LENGTH (ODBC 3.0)<BR>
+# SQL_FN_STR_CHAR (ODBC 1.0)<BR>
+# SQL_FN_STR_CHAR_<BR>
+# LENGTH (ODBC 3.0)<BR>
+# SQL_FN_STR_CHARACTER_<BR>
+# LENGTH (ODBC 3.0)<BR>
+# SQL_FN_STR_CONCAT (ODBC 1.0)<BR>
+# SQL_FN_STR_DIFFERENCE (ODBC 2.0)<BR>
+# SQL_FN_STR_INSERT (ODBC 1.0)<BR>
+# SQL_FN_STR_LCASE (ODBC 1.0)<BR>
+# SQL_FN_STR_LEFT (ODBC 1.0)<BR>
+# SQL_FN_STR_LENGTH (ODBC 1.0)<BR>
+# SQL_FN_STR_LOCATE (ODBC 1.0)<BR>
+# SQL_FN_STR_LTRIM (ODBC 1.0) <BR>
+# SQL_FN_STR_OCTET_<BR>
+# LENGTH (ODBC 3.0) <BR>
+# SQL_FN_STR_POSITION (ODBC 3.0)<BR>
+# SQL_FN_STR_REPEAT (ODBC 1.0)<BR>
+# SQL_FN_STR_REPLACE (ODBC 1.0)<BR>
+# SQL_FN_STR_RIGHT (ODBC 1.0)<BR>
+# SQL_FN_STR_RTRIM (ODBC 1.0)<BR>
+# SQL_FN_STR_SOUNDEX (ODBC 2.0)<BR>
+# SQL_FN_STR_SPACE (ODBC 2.0)<BR>
+# SQL_FN_STR_SUBSTRING (ODBC 1.0)<BR>
+# SQL_FN_STR_UCASE (ODBC 1.0)</P>
+#
+# <P>If an application can call the <B>LOCATE</B> scalar function with the <I>string_exp1</I>, <I>string_exp2</I>, and <I>start</I> arguments, the driver returns the SQL_FN_STR_LOCATE bitmask. If an application can call the LOCATE scalar function with only the <I>string_exp1</I> and <I>string_exp2</I> arguments, the driver returns the SQL_FN_STR_LOCATE_2 bitmask. Drivers that fully support the <B>LOCATE</B> scalar function return both bitmasks.</P>
+#
+# <P>(For more information, see <A HREF="odbcstring_functions.htm">String Functions</A> in Appendix E, "Scalar Functions.")</P>
+# </TD>
+# </TR>
+ SQL_STRING_FUNCTIONS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SUBQUERIES<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the predicates that support subqueries:
+# <P>SQL_SQ_CORRELATED_SUBQUERIES<BR>
+# SQL_SQ_COMPARISON<BR>
+# SQL_SQ_EXISTS<BR>
+# SQL_SQ_IN<BR>
+# SQL_SQ_QUANTIFIED</P>
+#
+# <P>The SQL_SQ_CORRELATED_SUBQUERIES bitmask indicates that all predicates that support subqueries support correlated subqueries.</P>
+#
+# <P>An SQL-92 Entry level&#0150;conformant driver will always return a bitmask in which all of these bits are set.</P>
+# </TD>
+# </TR>
+ SQL_SUBQUERIES => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_SYSTEM_FUNCTIONS<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the scalar system functions supported by the driver and associated data source.
+# <P>The following bitmasks are used to determine which system functions are supported:</P>
+#
+# <P>SQL_FN_SYS_DBNAME<BR>
+# SQL_FN_SYS_IFNULL<BR>
+# SQL_FN_SYS_USERNAME</P>
+# </TD>
+# </TR>
+ SQL_SYSTEM_FUNCTIONS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_TABLE_TERM<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string with the data source vendor's name for a table; for example, "table" or "file".
+# <P>This character string can be in upper, lower, or mixed case. </P>
+#
+# <P>An SQL-92 Entry level&#0150;conformant driver will always return "table".</P>
+# </TD>
+# </TR>
+ SQL_TABLE_TERM => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_TIMEDATE_ADD_INTERVALS<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the timestamp intervals supported by the driver and associated data source for the TIMESTAMPADD scalar function.
+# <P>The following bitmasks are used to determine which intervals are supported:</P>
+#
+# <P>SQL_FN_TSI_FRAC_SECOND<BR>
+# SQL_FN_TSI_SECOND<BR>
+# SQL_FN_TSI_MINUTE<BR>
+# SQL_FN_TSI_HOUR<BR>
+# SQL_FN_TSI_DAY<BR>
+# SQL_FN_TSI_WEEK<BR>
+# SQL_FN_TSI_MONTH<BR>
+# SQL_FN_TSI_QUARTER<BR>
+# SQL_FN_TSI_YEAR</P>
+#
+# <P>An FIPS Transitional level&#0150;conformant driver will always return a bitmask in which all of these bits are set.</P>
+# </TD>
+# </TR>
+ SQL_TIMEDATE_ADD_INTERVALS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_TIMEDATE_DIFF_INTERVALS<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the timestamp intervals supported by the driver and associated data source for the TIMESTAMPDIFF scalar function.
+# <P>The following bitmasks are used to determine which intervals are supported:</P>
+#
+# <P>SQL_FN_TSI_FRAC_SECOND<BR>
+# SQL_FN_TSI_SECOND<BR>
+# SQL_FN_TSI_MINUTE<BR>
+# SQL_FN_TSI_HOUR<BR>
+# SQL_FN_TSI_DAY<BR>
+# SQL_FN_TSI_WEEK<BR>
+# SQL_FN_TSI_MONTH<BR>
+# SQL_FN_TSI_QUARTER<BR>
+# SQL_FN_TSI_YEAR </P>
+#
+# <P>An FIPS Transitional level&#0150;conformant driver will always return a bitmask in which all of these bits are set.</P>
+# </TD>
+# </TR>
+ SQL_TIMEDATE_DIFF_INTERVALS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_TIMEDATE_FUNCTIONS<BR>
+# (ODBC 1.0)
+# <P>The information type was introduced in ODBC 1.0; each bitmask is labeled with the version in which it was introduced.</P>
+# </TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the scalar date and time functions supported by the driver and associated data source.
+# <P>The following bitmasks are used to determine which date and time functions are supported:</P>
+#
+# <P>SQL_FN_TD_CURRENT_DATE ODBC 3.0)<BR>
+# SQL_FN_TD_CURRENT_TIME (ODBC 3.0)<BR>
+# SQL_FN_TD_CURRENT_TIMESTAMP (ODBC 3.0)<BR>
+# SQL_FN_TD_CURDATE (ODBC 1.0)<BR>
+# SQL_FN_TD_CURTIME (ODBC 1.0) <BR>
+# SQL_FN_TD_DAYNAME (ODBC 2.0)<BR>
+# SQL_FN_TD_DAYOFMONTH (ODBC 1.0)<BR>
+# SQL_FN_TD_DAYOFWEEK (ODBC 1.0)<BR>
+# SQL_FN_TD_DAYOFYEAR (ODBC 1.0) <BR>
+# SQL_FN_TD_EXTRACT (ODBC 3.0)<BR>
+# SQL_FN_TD_HOUR (ODBC 1.0)<BR>
+# SQL_FN_TD_MINUTE (ODBC 1.0)<BR>
+# SQL_FN_TD_MONTH (ODBC 1.0)<BR>
+# SQL_FN_TD_MONTHNAME (ODBC 2.0)<BR>
+# SQL_FN_TD_NOW (ODBC 1.0)<BR>
+# SQL_FN_TD_QUARTER (ODBC 1.0)<BR>
+# SQL_FN_TD_SECOND (ODBC 1.0)<BR>
+# SQL_FN_TD_TIMESTAMPADD (ODBC 2.0)<BR>
+# SQL_FN_TD_TIMESTAMPDIFF (ODBC 2.0)<BR>
+# SQL_FN_TD_WEEK (ODBC 1.0)<BR>
+# SQL_FN_TD_YEAR (ODBC 1.0)</P>
+# </TD>
+# </TR>
+ SQL_TIMEDATE_FUNCTIONS => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_TXN_CAPABLE<BR>
+# (ODBC 1.0)
+# <P>The information type was introduced in ODBC 1.0; each return value is labeled with the version in which it was introduced.</P>
+# </TD>
+# <TD width=50%>An SQLUSMALLINT value describing the transaction support in the driver or data source:
+# <P>SQL_TC_NONE = Transactions not supported. (ODBC 1.0)</P>
+#
+# <P>SQL_TC_DML = Transactions can contain only Data Manipulation Language (DML) statements (<B>SELECT</B>, <B>INSERT</B>, <B>UPDATE</B>, <B>DELETE</B>). Data Definition Language (DDL) statements encountered in a transaction cause an error. (ODBC 1.0)</P>
+#
+# <P>SQL_TC_DDL_COMMIT = Transactions can contain only DML statements. DDL statements (<B>CREATE TABLE</B>, <B>DROP INDEX</B>, and so on) encountered in a transaction cause the transaction to be committed. (ODBC 2.0)</P>
+#
+# <P>SQL_TC_DDL_IGNORE = Transactions can contain only DML statements. DDL statements encountered in a transaction are ignored. (ODBC 2.0)</P>
+#
+# <P>SQL_TC_ALL = Transactions can contain DDL statements and DML statements in any order. (ODBC 1.0) </P>
+#
+# <P>(Because support of transactions is mandatory in SQL-92, an SQL-92 conformant driver [any level] will never return SQL_TC_NONE.)</P>
+# </TD>
+# </TR>
+ SQL_TXN_CAPABLE => {
+ type => q(Short),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_TXN_ISOLATION_OPTION<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the transaction isolation levels available from the driver or data source.
+# <P>The following bitmasks are used in conjunction with the flag to determine which options are supported:</P>
+#
+# <P>SQL_TXN_READ_UNCOMMITTED<BR>
+# SQL_TXN_READ_COMMITTED<BR>
+# SQL_TXN_REPEATABLE_READ<BR>
+# SQL_TXN_SERIALIZABLE</P>
+#
+# <P>For descriptions of these isolation levels, see the description of SQL_DEFAULT_TXN_ISOLATION.</P>
+#
+# <P>To set the transaction isolation level, an application calls <B>SQLSetConnectAttr</B> to set the SQL_ATTR_TXN_ISOLATION attribute. For more information, see <B>SQLSetConnectAttr</B>. </P>
+#
+# <P>An SQL-92 Entry level&#0150;conformant driver will always return SQL_TXN_SERIALIZABLE as supported. A FIPS Transitional level&#0150;conformant driver will always return all of these options as supported.</P>
+# </TD>
+# </TR>
+ SQL_TXN_ISOLATION_OPTION => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_UNION<BR>
+# (ODBC 2.0)</TD>
+# <TD width=50%>An SQLUINTEGER bitmask enumerating the support for the <B>UNION</B> clause:
+# <P>SQL_U_UNION = The data source supports the <B>UNION</B> clause.</P>
+#
+# <P>SQL_U_UNION_ALL = The data source supports the <B>ALL</B> keyword in the <B>UNION</B> clause. (<B>SQLGetInfo</B> returns both SQL_U_UNION and SQL_U_UNION_ALL in this case.)</P>
+#
+# <P>An SQL-92 Entry level&#0150;conformant driver will always return both of these options as supported.</P>
+# </TD>
+# </TR>
+ SQL_UNION => {
+ type => q(Bitmask),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_USER_NAME<BR>
+# (ODBC 1.0)</TD>
+# <TD width=50%>A character string with the name used in a particular database, which can be different from the login name.</TD>
+# </TR>
+ SQL_USER_NAME => {
+ type => q(Char),
+ },
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_XOPEN_CLI_YEAR<BR>
+# (ODBC 3.0)</TD>
+# <TD width=50%>A character string that indicates the year of publication of the X/Open specification with which the version of the ODBC Driver Manager fully complies.</TD>
+# </TR>
+ SQL_XOPEN_CLI_YEAR => {
+ type => q(Char),
+ },
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Code Example</B></P>
+#
+# <P><B>SQLGetInfo</B> returns lists of supported options as an SQLUINTEGER bitmask in *<I>InfoValuePtr</I>. The bitmask for each option is used in conjunction with the flag to determine whether the option is supported.</P>
+#
+# <P>For example, an application could use the following code to determine whether the SUBSTRING scalar function is supported by the driver associated with the connection:</P>
+#
+# <PRE class="code">SQLUINTEGER fFuncs;
+#
+# SQLGetInfo(hdbc,
+# SQL_STRING_FUNCTIONS,
+# (SQLPOINTER)&amp;fFuncs,
+# sizeof(fFuncs),
+# NULL);
+#
+# if (fFuncs &amp; SQL_FN_STR_SUBSTRING)&nbsp;&nbsp;&nbsp;/* SUBSTRING supported */
+# ;
+# else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* SUBSTRING not supported */
+# ;</PRE>
+#
+# <P class="label"><B>Related Functions</B></P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=50%>For information about</TH>
+# <TH width=50%>See</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Returning the setting of a connection attribute</TD>
+# <TD width=50%><A HREF="odbcsqlgetconnectattr.htm">SQLGetConnectAttr</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Determining whether a driver supports a function</TD>
+# <TD width=50%><A HREF="odbcsqlgetfunctions.htm">SQLGetFunctions</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Returning the setting of a statement attribute</TD>
+# <TD width=50%><A HREF="odbcsqlgetstmtattr.htm">SQLGetStmtAttr</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Returning information about a data source's data types</TD>
+# <TD width=50%><A HREF="odbcsqlgettypeinfo.htm">SQLGetTypeInfo</A></TD>
+# </TR>
+# </table></div>
+# <!--TS:--><H4><A NAME="feedback"></A></H4>
+# <SPAN id="SDKFeedB"></SPAN>
+# </div>
+#
+# </BODY>
+# </HTML>
+};
+
+print <<END;
+#include "HandleDbc.hpp"
+
+HandleDbc::InfoTab
+HandleDbc::m_infoTab[] = {
+END
+
+my @name = sort keys %$info;
+for my $name (@name) {
+ my $p = $info->{$name};
+ my $type = $p->{type};
+ $type =~ /^(Char|YesNo|Short|Long|Bitmask)$/
+ or die "$name: bad type $type";
+ my $defstr = $type eq "YesNo" ? q("N") : $type eq "Char" ? q("") : q(0);
+ my $s = <<END;
+ { $name,
+ InfoTab\::$type,
+ 0L,
+ $defstr
+ },
+END
+ if ($p->{omit}) {
+ $s ="#if 0\n" . $s . "#endif\n";
+ }
+ print $s;
+};
+
+print <<END;
+ { 0,
+ InfoTab::End,
+ 0L,
+ 0
+ }
+};
+END
+
+# vim: set sw=4:
diff --git a/storage/ndb/src/old_files/client/odbc/docs/gettypeinfo.pl b/storage/ndb/src/old_files/client/odbc/docs/gettypeinfo.pl
new file mode 100644
index 00000000000..0a999fd7249
--- /dev/null
+++ b/storage/ndb/src/old_files/client/odbc/docs/gettypeinfo.pl
@@ -0,0 +1,645 @@
+# usage: perl TypeInfo.data
+# prints template for typeinfo
+use strict;
+my $position = 0;
+
+#
+# odbcsqlgettypeinfo.htm
+#
+my @typeinfo = (
+ { name => "UNDEF",
+ type => q(Undef),
+ nullable => q(true),
+ position => 0,
+ },
+# <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+# <HTML DIR="LTR"><HEAD>
+# <META HTTP-EQUIV="Content-Type" Content="text/html; charset=Windows-1252">
+# <TITLE>SQLGetTypeInfo</TITLE>
+# <SCRIPT SRC="/stylesheets/vs70link.js"></SCRIPT>
+# <SCRIPT SRC="/stylesheets/vs70.js"></SCRIPT>
+# <SCRIPT LANGUAGE="JScript" SRC="/stylesheets/odbc.js"></SCRIPT>
+# </HEAD>
+# <body topmargin=0 id="bodyID">
+#
+# <div id="nsbanner">
+# <div id="bannertitle">
+# <TABLE CLASS="bannerparthead" CELLSPACING=0>
+# <TR ID="hdr">
+# <TD CLASS="bannertitle" nowrap>
+# ODBC Programmer's Reference
+# </TD><TD valign=middle><a href="#Feedback"><IMG name="feedb" onclick=EMailStream(SDKFeedB) style="CURSOR: hand;" hspace=15 alt="" src="/stylesheets/mailto.gif" align=right></a></TD>
+# </TR>
+# </TABLE>
+# </div>
+# </div>
+# <DIV id="nstext" valign="bottom">
+#
+# <H1><A NAME="odbcsqlgettypeinfo"></A>SQLGetTypeInfo</H1>
+#
+# <P class="label"><B>Conformance</B></P>
+#
+# <P>Version Introduced: ODBC 1.0<BR>
+# Standards Compliance: ISO 92</P>
+#
+# <P class="label"><B>Summary</B></P>
+#
+# <P><B>SQLGetTypeInfo</B> returns information about data types supported by the data source. The driver returns the information in the form of an SQL result set. The data types are intended for use in Data Definition Language (DDL) statements.</P>
+#
+# <P class="indent"><b class="le">Important&nbsp;&nbsp;&nbsp;</b>Applications must use the type names returned in the TYPE_NAME column of the <B>SQLGetTypeInfo</B> result set in <B>ALTER TABLE</B> and <B>CREATE TABLE</B> statements. <B>SQLGetTypeInfo</B> may return more than one row with the same value in the DATA_TYPE column.</P>
+#
+# <P class="label"><B>Syntax</B></P>
+#
+# <PRE class="syntax">SQLRETURN <B>SQLGetTypeInfo</B>(
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLHSTMT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>StatementHandle</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLSMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>DataType</I>);</PRE>
+#
+# <P class="label"><B>Arguments</B>
+#
+# <DL>
+# <DT><I>StatementHandle</I></DT>
+#
+# <DD>[Input]<BR>
+# Statement handle for the result set.</dd>
+#
+# <DT><I>DataType</I></DT>
+#
+# <DD>[Input]<BR>
+# The SQL data type. This must be one of the values in the "<A HREF="odbcsql_data_types.htm">SQL Data Types</A>" section of Appendix D: Data Types, or a driver-specific SQL data type. SQL_ALL_TYPES specifies that information about all data types should be returned.</dd>
+# </DL>
+#
+# <P class="label"><B>Returns</B></P>
+#
+# <P>SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR, or SQL_INVALID_HANDLE.</P>
+#
+# <P class="label"><B>Diagnostics</B></P>
+#
+# <P>When <B>SQLGetTypeInfo</B> returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value can be obtained by calling <B>SQLGetDiagRec</B> with a <I>HandleType</I> of SQL_HANDLE_STMT and a <I>Handle</I> of <I>StatementHandle</I>. The following table lists the SQLSTATE values commonly returned by <B>SQLGetTypeInfo </B>and explains each one in the context of this function; the notation "(DM)" precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=22%>SQLSTATE</TH>
+# <TH width=26%>Error</TH>
+# <TH width=52%>Description</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>01000</TD>
+# <TD width=26%>General warning</TD>
+# <TD width=52%>Driver-specific informational message. (Function returns SQL_SUCCESS_WITH_INFO.)</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>01S02</TD>
+# <TD width=26%>Option value changed</TD>
+# <TD width=52%>A specified statement attribute was invalid because of implementation working conditions, so a similar value was temporarily substituted. (Call <B>SQLGetStmtAttr</B> to determine the temporarily substituted value.) The substitute value is valid for the <I>StatementHandle</I> until the cursor is closed. The statement attributes that can be changed are: SQL_ATTR_CONCURRENCY, SQL_ATTR_CURSOR_TYPE, SQL_ATTR_KEYSET_SIZE, SQL_ATTR_MAX_LENGTH, SQL_ATTR_MAX_ROWS, SQL_ATTR_QUERY_TIMEOUT, and SQL_ATTR_SIMULATE_CURSOR. (Function returns SQL_SUCCESS_WITH_INFO.)</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>08S01</TD>
+# <TD width=26%>Communication link failure</TD>
+# <TD width=52%>The communication link between the driver and the data source to which the driver was connected failed before the function completed processing.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>24000</TD>
+# <TD width=26%>Invalid cursor state</TD>
+# <TD width=52%>A cursor was open on the <I>StatementHandle,</I> and <B>SQLFetch</B> or <B>SQLFetchScroll</B> had been called. This error is returned by the Driver Manager if <B>SQLFetch</B> or <B>SQLFetchScroll</B> has not returned SQL_NO_DATA, and is returned by the driver if <B>SQLFetch</B> or <B>SQLFetchScroll</B> has returned SQL_NO_DATA.
+# <P>A result set was open on the <I>StatementHandle</I>, but <B>SQLFetch</B> or <B>SQLFetchScroll</B> had not been called.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>40001</TD>
+# <TD width=26%>Serialization failure</TD>
+# <TD width=52%>The transaction was rolled back due to a resource deadlock with another transaction.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>40003</TD>
+# <TD width=26%>Statement completion unknown</TD>
+# <TD width=52%>The associated connection failed during the execution of this function and the state of the transaction cannot be determined.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY000</TD>
+# <TD width=26%>General error</TD>
+# <TD width=52%>An error occurred for which there was no specific SQLSTATE and for which no implementation-specific SQLSTATE was defined. The error message returned by <B>SQLGetDiagRec</B> in the <I>*MessageText</I> buffer describes the error and its cause. </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY001</TD>
+# <TD width=26%>Memory allocation error</TD>
+# <TD width=52%>The driver was unable to allocate memory required to support execution or completion of the function.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY004</TD>
+# <TD width=26%>Invalid SQL data type</TD>
+# <TD width=52%>The value specified for the argument <I>DataType</I> was neither a valid ODBC SQL data type identifier nor a driver-specific data type identifier supported by the driver.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY008</TD>
+# <TD width=26%>Operation canceled</TD>
+# <TD width=52%>Asynchronous processing was enabled for the <I>StatementHandle</I>, then the function was called and, before it completed execution, <B>SQLCancel</B> was called on the <I>StatementHandle</I>. Then the function was called again on the <I>StatementHandle</I>.
+# <P>The function was called and, before it completed execution, <B>SQLCancel</B> was called on the <I>StatementHandle</I> from a different thread in a multithread application.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY010</TD>
+# <TD width=26%>Function sequence error</TD>
+# <TD width=52%>(DM) An asynchronously executing function (not this one) was called for the <I>StatementHandle</I> and was still executing when this function was called.
+# <P>(DM) <B>SQLExecute</B>, <B>SQLExecDirect</B>, <B>SQLBulkOperations</B>, or <B>SQLSetPos</B> was called for the <I>StatementHandle</I> and returned SQL_NEED_DATA. This function was called before data was sent for all data-at-execution parameters or columns.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY013</TD>
+# <TD width=26%>Memory management error</TD>
+# <TD width=52%>The function call could not be processed because the underlying memory objects could not be accessed, possibly because of low memory conditions.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYC00</TD>
+# <TD width=26%>Optional feature not implemented</TD>
+# <TD width=52%>The combination of the current settings of the SQL_ATTR_CONCURRENCY and SQL_ATTR_CURSOR_TYPE statement attributes was not supported by the driver or data source.
+# <P>The SQL_ATTR_USE_BOOKMARKS statement attribute was set to SQL_UB_VARIABLE, and the SQL_ATTR_CURSOR_TYPE statement attribute was set to a cursor type for which the driver does not support bookmarks.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYT00</TD>
+# <TD width=26%>Timeout expired</TD>
+# <TD width=52%>The query timeout period expired before the data source returned the result set. The timeout period is set through <B>SQLSetStmtAttr</B>, SQL_ATTR_QUERY_TIMEOUT.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYT01</TD>
+# <TD width=26%>Connection timeout expired</TD>
+# <TD width=52%>The connection timeout period expired before the data source responded to the request. The connection timeout period is set through <B>SQLSetConnectAttr</B>, SQL_ATTR_CONNECTION_TIMEOUT.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>IM001</TD>
+# <TD width=26%>Driver does not support this function</TD>
+# <TD width=52%>(DM) The driver corresponding to the <I>StatementHandle</I> does not support the function.</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Comments</B></P>
+#
+# <P><B>SQLGetTypeInfo</B> returns the results as a standard result set, ordered by DATA_TYPE and then by how closely the data type maps to the corresponding ODBC SQL data type. Data types defined by the data source take precedence over user-defined data types. Consequently, the sort order is not necessarily consistent but can be generalized as DATA_TYPE first, followed by TYPE_NAME, both ascending. For example, suppose that a data source defined INTEGER and COUNTER data types, where COUNTER is auto-incrementing, and that a user-defined data type WHOLENUM has also been defined. These would be returned in the order INTEGER, WHOLENUM, and COUNTER, because WHOLENUM maps closely to the ODBC SQL data type SQL_INTEGER, while the auto-incrementing data type, even though supported by the data source, does not map closely to an ODBC SQL data type. For information about how this information might be used, see "<A HREF="odbcddl_statements.htm">DDL Statements</A>" in Chapter 8: SQL Statements.</P>
+#
+# <P>If the <I>DataType</I> argument specifies a data type which is valid for the version of ODBC supported by the driver, but is not supported by the driver, then it will return an empty result set. </P>
+#
+# <P class="indent"><b class="le">Note&nbsp;&nbsp;&nbsp;</b>For more information about the general use, arguments, and returned data of ODBC catalog functions, see <A HREF="odbccatalog_functions.htm">Chapter 7: Catalog Functions</A>.</P>
+#
+# <P>The following columns have been renamed for ODBC 3.<I>x</I>. The column name changes do not affect backward compatibility because applications bind by column number.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=48%>ODBC 2.0 column</TH>
+# <TH width=52%>ODBC 3.<I>x</I> column</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>PRECISION</TD>
+# <TD width=52%>COLUMN_SIZE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>MONEY</TD>
+# <TD width=52%>FIXED_PREC_SCALE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>AUTO_INCREMENT</TD>
+# <TD width=52%>AUTO_UNIQUE_VALUE</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P>The following columns have been added to the results set returned by <B>SQLGetTypeInfo</B> for ODBC 3.<I>x</I>:
+#
+# <UL type=disc>
+# <LI>SQL_DATA_TYPE</li>
+#
+# <LI>INTERVAL_PRECISION</li>
+#
+# <LI>SQL_DATETIME_SUB</li>
+#
+# <LI>NUM_PREC_RADIX</li>
+# </UL>
+#
+# <P>The following table lists the columns in the result set. Additional columns beyond column 19 (INTERVAL_PRECISION) can be defined by the driver. An application should gain access to driver-specific columns by counting down from the end of the result set rather than specifying an explicit ordinal position. For more information, see "<A HREF="odbcdata_returned_by_catalog_functions.htm">Data Returned by Catalog Functions</A>" in Chapter 7: Catalog Functions.</P>
+#
+# <P class="indent"><b class="le">Note</b>&nbsp;&nbsp;&nbsp;<B>SQLGetTypeInfo</B> might not return all data types. For example, a driver might not return user-defined data types. Applications can use any valid data type, regardless of whether it is returned by <B>SQLGetTypeInfo</B>.</P>
+#
+# <P class="indent">The data types returned by <B>SQLGetTypeInfo</B> are those supported by the data source. They are intended for use in Data Definition Language (DDL) statements. Drivers can return result-set data using data types other than the types returned by <B>SQLGetTypeInfo</B>. In creating the result set for a catalog function, the driver might use a data type that is not supported by the data source. </P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=33%><BR>
+# Column name</TH>
+# <TH width=14%>Column <BR>
+# number</TH>
+# <TH width=15%><BR>
+# Data type</TH>
+# <TH width=38%><BR>
+# Comments</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=33%>TYPE_NAME<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>1</TD>
+# <TD width=15%>Varchar<BR>
+# not NULL</TD>
+# <TD width=38%>Data source&#0150;dependent data-type name; for example, "CHAR()", "VARCHAR()", "MONEY", "LONG VARBINARY", or "CHAR ( ) FOR BIT DATA". Applications must use this name in <B>CREATE TABLE</B> and <B>ALTER TABLE</B> statements.</TD>
+# </TR>
+ { name => "TYPE_NAME",
+ type => q(Varchar),
+ length => 20,
+ nullable => q(false),
+ position => ++$position,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>DATA_TYPE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>2</TD>
+# <TD width=15%>Smallint<BR>
+# not NULL</TD>
+# <TD width=38%>SQL data type. This can be an ODBC SQL data type or a driver-specific SQL data type. For datetime or interval data types, this column returns the concise data type (such as SQL_TYPE_TIME or SQL_INTERVAL_YEAR_TO_MONTH). For a list of valid ODBC SQL data types, see "<A HREF="odbcsql_data_types.htm">SQL Data Types</A>" in Appendix D: Data Types. For information about driver-specific SQL data types, see the driver’s documentation.</TD>
+# </TR>
+ { name => "DATA_TYPE",
+ type => q(Smallint),
+ length => undef,
+ nullable => q(false),
+ position => ++$position,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>COLUMN_SIZE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>3</TD>
+# <TD width=15%>Integer</TD>
+# <TD width=38%>The maximum column size that the server supports for this data type. For numeric data, this is the maximum precision. For string data, this is the length in characters. For datetime data types, this is the length in characters of the string representation (assuming the maximum allowed precision of the fractional seconds component). NULL is returned for data types where column size is not applicable. For interval data types, this is the number of characters in the character representation of the interval literal (as defined by the interval leading precision; see "<A HREF="odbcinterval_data_type_length.htm">Interval Data Type Length</A>" in Appendix D: Data Types).
+# <P>For more information on column size, see "<A HREF="odbccolumn_size__decimal_digits__transfer_octet_length__and_display_size.htm">Column Size, Decimal Digits, Transfer Octet Length, and Display Size</A>" in Appendix D: Data Types.</P>
+# </TD>
+# </TR>
+ { name => "COLUMN_SIZE",
+ type => q(Integer),
+ length => undef,
+ nullable => q(true),
+ position => ++$position,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>LITERAL_PREFIX<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>4</TD>
+# <TD width=15%>Varchar</TD>
+# <TD width=38%>Character or characters used to prefix a literal; for example, a single quotation mark (') for character data types or 0x for binary data types; NULL is returned for data types where a literal prefix is not applicable.</TD>
+# </TR>
+ { name => "LITERAL_PREFIX",
+ type => q(Varchar),
+ length => 1,
+ nullable => q(true),
+ position => ++$position,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>LITERAL_SUFFIX<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>5</TD>
+# <TD width=15%>Varchar</TD>
+# <TD width=38%>Character or characters used to terminate a literal; for example, a single quotation mark (') for character data types; NULL is returned for data types where a literal suffix is not applicable.</TD>
+# </TR>
+ { name => "LITERAL_SUFFIX",
+ type => q(Varchar),
+ length => 1,
+ nullable => q(true),
+ position => ++$position,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>CREATE_PARAMS<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>6</TD>
+# <TD width=15%>Varchar</TD>
+# <TD width=38%>A list of keywords, separated by commas, corresponding to each parameter that the application may specify in parentheses when using the name that is returned in the TYPE_NAME field. The keywords in the list can be any of the following: length, precision, or scale. They appear in the order that the syntax requires them to be used. For example, CREATE_PARAMS for DECIMAL would be "precision,scale"; CREATE_PARAMS for VARCHAR would equal "length." NULL is returned if there are no parameters for the data type definition; for example, INTEGER.
+# <P>The driver supplies the CREATE_PARAMS text in the language of the country where it is used.</P>
+# </TD>
+# </TR>
+ { name => "CREATE_PARAMS",
+ type => q(Varchar),
+ length => 20,
+ nullable => q(true),
+ position => ++$position,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>NULLABLE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>7</TD>
+# <TD width=15%>Smallint<BR>
+# not NULL</TD>
+# <TD width=38%>Whether the data type accepts a NULL value:
+# <P>SQL_NO_NULLS if the data type does not accept NULL values.</P>
+#
+# <P>SQL_NULLABLE if the data type accepts NULL values.</P>
+#
+# <P>SQL_NULLABLE_UNKNOWN if it is not known whether the column accepts NULL values.</P>
+# </TD>
+# </TR>
+ { name => "NULLABLE",
+ type => q(Smallint),
+ length => undef,
+ nullable => q(false),
+ position => ++$position,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>CASE_SENSITIVE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>8</TD>
+# <TD width=15%>Smallint<BR>
+# not NULL</TD>
+# <TD width=38%>Whether a character data type is case-sensitive in collations and comparisons:
+# <P>SQL_TRUE if the data type is a character data type and is case-sensitive.</P>
+#
+# <P>SQL_FALSE if the data type is not a character data type or is not case-sensitive.</P>
+# </TD>
+# </TR>
+ { name => "CASE_SENSITIVE",
+ type => q(Smallint),
+ length => undef,
+ nullable => q(false),
+ position => ++$position,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>SEARCHABLE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>9</TD>
+# <TD width=15%>Smallint<BR>
+# not NULL</TD>
+# <TD width=38%>How the data type is used in a <B>WHERE</B> clause:
+# <P>SQL_PRED_NONE if the column cannot be used in a <B>WHERE</B> clause. (This is the same as the SQL_UNSEARCHABLE value in ODBC 2.<I>x</I>.)</P>
+#
+# <P>SQL_PRED_CHAR if the column can be used in a <B>WHERE</B> clause, but only with the <B>LIKE</B> predicate. (This is the same as the SQL_LIKE_ONLY value in ODBC 2.<I>x</I>.)</P>
+#
+# <P>SQL_PRED_BASIC if the column can be used in a <B>WHERE</B> clause with all the comparison operators except <B>LIKE</B> (comparison, quantified comparison, <B>BETWEEN</B>, <B>DISTINCT</B>, <B>IN</B>, <B>MATCH</B>, and <B>UNIQUE</B>). (This is the same as the SQL_ALL_EXCEPT_LIKE value in ODBC 2.<I>x</I>.)</P>
+#
+# <P>SQL_SEARCHABLE if the column can be used in a <B>WHERE</B> clause with any comparison operator.</P>
+# </TD>
+# </TR>
+ { name => "SEARCHABLE",
+ type => q(Smallint),
+ length => undef,
+ nullable => q(false),
+ position => ++$position,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>UNSIGNED_ATTRIBUTE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>10</TD>
+# <TD width=15%>Smallint</TD>
+# <TD width=38%>Whether the data type is unsigned:
+# <P>SQL_TRUE if the data type is unsigned.</P>
+#
+# <P>SQL_FALSE if the data type is signed.</P>
+#
+# <P>NULL is returned if the attribute is not applicable to the data type or the data type is not numeric.</P>
+# </TD>
+# </TR>
+ { name => "UNSIGNED_ATTRIBUTE",
+ type => q(Smallint),
+ length => undef,
+ nullable => q(true),
+ position => ++$position,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>FIXED_PREC_SCALE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>11</TD>
+# <TD width=15%>Smallint<BR>
+# not NULL</TD>
+# <TD width=38%>Whether the data type has predefined fixed precision and scale (which are data source&#0150;specific), such as a money data type:
+# <P>SQL_TRUE if it has predefined fixed precision and scale.</P>
+#
+# <P>SQL_FALSE if it does not have predefined fixed precision and scale.</P>
+# </TD>
+# </TR>
+ { name => "FIXED_PREC_SCALE",
+ type => q(Smallint),
+ length => undef,
+ nullable => q(false),
+ position => ++$position,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>AUTO_UNIQUE_VALUE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>12</TD>
+# <TD width=15%>Smallint</TD>
+# <TD width=38%>Whether the data type is autoincrementing:
+# <P>SQL_TRUE if the data type is autoincrementing.</P>
+#
+# <P>SQL_FALSE if the data type is not autoincrementing.</P>
+#
+# <P>NULL is returned if the attribute is not applicable to the data type or the data type is not numeric.</P>
+#
+# <P>An application can insert values into a column having this attribute, but typically cannot update the values in the column. </P>
+#
+# <P>When an insert is made into an auto-increment column, a unique value is inserted into the column at insert time. The increment is not defined, but is data source&#0150;specific. An application should not assume that an auto-increment column starts at any particular point or increments by any particular value.</P>
+# </TD>
+# </TR>
+ { name => "AUTO_UNIQUE_VALUE",
+ type => q(Smallint),
+ length => undef,
+ nullable => q(true),
+ position => ++$position,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>LOCAL_TYPE_NAME<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>13</TD>
+# <TD width=15%>Varchar</TD>
+# <TD width=38%>Localized version of the data source&#0150;dependent name of the data type. NULL is returned if a localized name is not supported by the data source. This name is intended for display only, such as in dialog boxes.</TD>
+# </TR>
+ { name => "LOCAL_TYPE_NAME",
+ type => q(Varchar),
+ length => 20,
+ nullable => q(true),
+ position => ++$position,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>MINIMUM_SCALE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>14</TD>
+# <TD width=15%>Smallint</TD>
+# <TD width=38%>The minimum scale of the data type on the data source. If a data type has a fixed scale, the MINIMUM_SCALE and MAXIMUM_SCALE columns both contain this value. For example, an SQL_TYPE_TIMESTAMP column might have a fixed scale for fractional seconds. NULL is returned where scale is not applicable. For more information, see "<A HREF="odbccolumn_size__decimal_digits__transfer_octet_length__and_display_size.htm">Column Size, Decimal Digits, Transfer Octet Length, and Display Size</A>" in Appendix D: Data Types.</TD>
+# </TR>
+ { name => "MINIMUM_SCALE",
+ type => q(Smallint),
+ length => undef,
+ nullable => q(true),
+ position => ++$position,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>MAXIMUM_SCALE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>15</TD>
+# <TD width=15%>Smallint</TD>
+# <TD width=38%>The maximum scale of the data type on the data source. NULL is returned where scale is not applicable. If the maximum scale is not defined separately on the data source, but is instead defined to be the same as the maximum precision, this column contains the same value as the COLUMN_SIZE column. For more information, see "<A HREF="odbccolumn_size__decimal_digits__transfer_octet_length__and_display_size.htm">Column Size, Decimal Digits, Transfer Octet Length, and Display Size</A>" in Appendix D: Data Types.</TD>
+# </TR>
+ { name => "MAXIMUM_SCALE",
+ type => q(Smallint),
+ length => undef,
+ nullable => q(true),
+ position => ++$position,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>SQL_DATA_TYPE<BR>
+# (ODBC 3.0)</TD>
+# <TD width=14%>16</TD>
+# <TD width=15%>Smallint NOT NULL</TD>
+# <TD width=38%>The value of the SQL data type as it appears in the SQL_DESC_TYPE field of the descriptor. This column is the same as the DATA_TYPE column, except for interval and datetime data types.
+# <P>For interval and datetime data types, the SQL_DATA_TYPE field in the result set will return SQL_INTERVAL or SQL_DATETIME, and the SQL_DATETIME_SUB field will return the subcode for the specific interval or datetime data type. (See <A HREF="odbcdata_types.htm">Appendix D: Data Types</A>.) </P>
+# </TD>
+# </TR>
+ { name => "SQL_DATA_TYPE",
+ type => q(Smallint),
+ length => undef,
+ nullable => q(false),
+ position => ++$position,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>SQL_DATETIME_SUB<BR>
+# (ODBC 3.0)</TD>
+# <TD width=14%>17</TD>
+# <TD width=15%>Smallint</TD>
+# <TD width=38%>When the value of SQL_DATA_TYPE is SQL_DATETIME or SQL_INTERVAL, this column contains the datetime/interval subcode. For data types other than datetime and interval, this field is NULL.
+# <P>For interval or datetime data types, the SQL_DATA_TYPE field in the result set will return SQL_INTERVAL or SQL_DATETIME, and the SQL_DATETIME_SUB field will return the subcode for the specific interval or datetime data type. (See <A HREF="odbcdata_types.htm">Appendix D: Data Types</A>.)</P>
+# </TD>
+# </TR>
+ { name => "SQL_DATETIME_SUB",
+ type => q(Smallint),
+ length => undef,
+ nullable => q(true),
+ position => ++$position,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>NUM_PREC_RADIX<BR>
+# (ODBC 3.0)</TD>
+# <TD width=14%>18</TD>
+# <TD width=15%>Integer</TD>
+# <TD width=38%>If the data type is an approximate numeric type, this column contains the value 2 to indicate that COLUMN_SIZE specifies a number of bits. For exact numeric types, this column contains the value 10 to indicate that COLUMN_SIZE specifies a number of decimal digits. Otherwise, this column is NULL.</TD>
+# </TR>
+ { name => "NUM_PREC_RADIX",
+ type => q(Integer),
+ length => undef,
+ nullable => q(true),
+ position => ++$position,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>INTERVAL_PRECISION<BR>
+# (ODBC 3.0)</TD>
+# <TD width=14%>19</TD>
+# <TD width=15%>Smallint</TD>
+# <TD width=38%>If the data type is an interval data type, then this column contains the value of the interval leading precision. (See "<A HREF="odbcinterval_data_type_precision.htm">Interval Data Type Precision</A>" in Appendix D: Data Types.) Otherwise, this column is NULL.</TD>
+# </TR>
+ { name => "INTERVAL_PRECISION",
+ type => q(Smallint),
+ length => undef,
+ nullable => q(true),
+ position => ++$position,
+ },
+# </table></div>
+# <!--TS:-->
+# <P>Attribute information can apply to data types or to specific columns in a result set. <B>SQLGetTypeInfo</B> returns information about attributes associated with data types; <B>SQLColAttribute</B> returns information about attributes associated with columns in a result set.</P>
+#
+# <P class="label"><B>Related Functions</B></P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=50%>For information about</TH>
+# <TH width=50%>See</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Binding a buffer to a column in a result set</TD>
+# <TD width=50%><A HREF="odbcsqlbindcol.htm">SQLBindCol</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Canceling statement processing</TD>
+# <TD width=50%><A HREF="odbcsqlcancel.htm">SQLCancel</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Returning information about a column in a result set</TD>
+# <TD width=50%><A HREF="odbcsqlcolattribute.htm">SQLColAttribute</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Fetching a block of data or scrolling through a result set</TD>
+# <TD width=50%><A HREF="odbcsqlfetchscroll.htm">SQLFetchScroll</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Fetching a single row or a block of data in a forward-only direction</TD>
+# <TD width=50%><A HREF="odbcsqlfetch.htm">SQLFetch</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Returning information about a driver or data source</TD>
+# <TD width=50%><A HREF="odbcsqlgetinfo.htm">SQLGetInfo</A></TD>
+# </TR>
+# </table></div>
+# <!--TS:--><H4><A NAME="feedback"></A></H4>
+# <SPAN id="SDKFeedB"></SPAN>
+# </div>
+#
+# </BODY>
+# </HTML>
+);
+
+my $i4 = " " x 4;
+print "// template-begin\n";
+print "#define Varchar Char\n";
+print "#define Smallint Integer\n";
+print "const SqlTypeInfo::Column\nSqlTypeInfo::m_columnList[] = {\n";
+for my $p (@typeinfo) {
+ print "$i4\{\t$p->{position},\n";
+ print "\t\"$p->{name}\",\n";
+ my $type = $p->{type};
+ if ($p->{position} == 0) {
+ print "\tSqlType()\n";
+ } elsif (! $p->{length}) {
+ print "\tSqlType(SqlType::$type, $p->{nullable})\n";
+ } else {
+ print "\tSqlType(SqlType::$type, $p->{length}, $p->{nullable})\n";
+ }
+ my $c = $p == $typeinfo[-1] ? "" : ",";
+ print "$i4\}$c\n";
+}
+print "};\n";
+print "#undef Varchar\n";
+print "#undef Smallint\n";
+print "const unsigned\nSqlTypeInfo::m_columnCount = $position;\n";
+print "// template-end\n";
+
+# vim: set sw=4:
diff --git a/storage/ndb/src/old_files/client/odbc/docs/handleattr.pl b/storage/ndb/src/old_files/client/odbc/docs/handleattr.pl
new file mode 100644
index 00000000000..892d34b105b
--- /dev/null
+++ b/storage/ndb/src/old_files/client/odbc/docs/handleattr.pl
@@ -0,0 +1,2232 @@
+# usage: perl Attr.data X (X = Env,Dbc,Stmt)
+# prints template for AttrX.cpp
+use strict;
+my $type = shift;
+my $order = 0;
+
+#
+# odbcsqlsetenvattr.htm
+#
+my $attrEnv = {
+# <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+# <HTML DIR="LTR"><HEAD>
+# <META HTTP-EQUIV="Content-Type" Content="text/html; charset=Windows-1252">
+# <TITLE>SQLSetEnvAttr</TITLE>
+# <SCRIPT SRC="/stylesheets/vs70link.js"></SCRIPT>
+# <SCRIPT SRC="/stylesheets/vs70.js"></SCRIPT>
+# <SCRIPT LANGUAGE="JScript" SRC="/stylesheets/odbc.js"></SCRIPT>
+# </HEAD>
+# <body topmargin=0 id="bodyID">
+#
+# <div id="nsbanner">
+# <div id="bannertitle">
+# <TABLE CLASS="bannerparthead" CELLSPACING=0>
+# <TR ID="hdr">
+# <TD CLASS="bannertitle" nowrap>
+# ODBC Programmer's Reference
+# </TD><TD valign=middle><a href="#Feedback"><IMG name="feedb" onclick=EMailStream(SDKFeedB) style="CURSOR: hand;" hspace=15 alt="" src="/stylesheets/mailto.gif" align=right></a></TD>
+# </TR>
+# </TABLE>
+# </div>
+# </div>
+# <DIV id="nstext" valign="bottom">
+#
+# <H1><A NAME="odbcsqlsetenvattr"></A>SQLSetEnvAttr</H1>
+#
+# <P class="label"><B>Conformance</B></P>
+#
+# <P>Version Introduced: ODBC 3.0<BR>
+# Standards Compliance: ISO 92</P>
+#
+# <P class="label"><B>Summary</B></P>
+#
+# <P><B>SQLSetEnvAttr</B> sets attributes that govern aspects of environments.</P>
+#
+# <P class="label"><B>Syntax</B></P>
+#
+# <PRE class="syntax">SQLRETURN <B>SQLSetEnvAttr</B>(
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLHENV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>EnvironmentHandle</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLINTEGER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>Attribute</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLPOINTER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>ValuePtr</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLINTEGER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>StringLength</I>);</PRE>
+#
+# <P class="label"><B>Arguments</B>
+#
+# <DL>
+# <DT><I>EnvironmentHandle</I></DT>
+#
+# <DD>[Input]<BR>
+# Environment handle.</dd>
+#
+# <DT><I>Attribute</I></DT>
+#
+# <DD>[Input]<BR>
+# Attribute to set, listed in "Comments."</dd>
+#
+# <DT><I>ValuePtr</I></DT>
+#
+# <DD>[Input]<BR>
+# Pointer to the value to be associated with <I>Attribute</I>. Depending on the value of <I>Attribute</I>, <I>ValuePtr</I> will be a 32-bit integer value or point to a null-terminated character string.</dd>
+#
+# <DT><I>StringLength</I></DT>
+#
+# <DD>[Input] If <I>ValuePtr</I> points to a character string or a binary buffer, this argument should be the length of *<I>ValuePtr</I>. If <I>ValuePtr</I> is an integer, <I>StringLength</I> is ignored.</dd>
+# </DL>
+#
+# <P class="label"><B>Returns</B></P>
+#
+# <P>SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or SQL_INVALID_HANDLE.</P>
+#
+# <P class="label"><B>Diagnostics</B></P>
+#
+# <P>When <B>SQLSetEnvAttr</B> returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value can be obtained by calling <B>SQLGetDiagRec</B> with a <I>HandleType</I> of SQL_HANDLE_ENV and a <I>Handle</I> of <I>EnvironmentHandle</I>. The following table lists the SQLSTATE values commonly returned by <B>SQLSetEnvAttr</B> and explains each one in the context of this function; the notation "(DM)" precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise. If a driver does not support an environment attribute, the error can be returned only during connect time.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=22%>SQLSTATE</TH>
+# <TH width=26%>Error</TH>
+# <TH width=52%>Description</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>01000</TD>
+# <TD width=26%>General warning</TD>
+# <TD width=52%>Driver-specific informational message. (Function returns SQL_SUCCESS_WITH_INFO.)</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>01S02</TD>
+# <TD width=26%>Option value changed</TD>
+# <TD width=52%>The driver did not support the value specified in <I>ValuePtr</I> and substituted a similar value. (Function returns SQL_SUCCESS_WITH_INFO.)</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY000</TD>
+# <TD width=26%>General error</TD>
+# <TD width=52%>An error occurred for which there was no specific SQLSTATE and for which no implementation-specific SQLSTATE was defined. The error message returned by <B>SQLGetDiagRec</B> in the <I>*MessageText</I> buffer describes the error and its cause.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY001</TD>
+# <TD width=26%>Memory allocation <BR>
+# error</TD>
+# <TD width=52%>The driver was unable to allocate memory required to support execution or completion of the function.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY009</TD>
+# <TD width=26%>Invalid use of null pointer</TD>
+# <TD width=52%>The Attribute argument identified an environment attribute that required a string value, and the <I>ValuePtr</I> argument was a null pointer.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY010</TD>
+# <TD width=26%>Function sequence error</TD>
+# <TD width=52%>(DM) A connection handle has been allocated on <I>EnvironmentHandle</I>. </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY013</TD>
+# <TD width=26%>Memory management error</TD>
+# <TD width=52%>The function call could not be processed because the underlying memory objects could not be accessed, possibly because of low memory conditions.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY024</TD>
+# <TD width=26%>Invalid attribute value</TD>
+# <TD width=52%>Given the specified <I>Attribute</I> value, an invalid value was specified in <I>ValuePtr</I>.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY090</TD>
+# <TD width=26%>Invalid string or buffer length</TD>
+# <TD width=52%>The <I>StringLength</I> argument was less than 0 but was not SQL_NTS.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY092</TD>
+# <TD width=26%>Invalid attribute/option identifier</TD>
+# <TD width=52%>(DM) The value specified for the argument <I>Attribute</I> was not valid for the version of ODBC supported by the driver.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYC00</TD>
+# <TD width=26%>Optional feature not implemented</TD>
+# <TD width=52%>The value specified for the argument <I>Attribute</I> was a valid ODBC environment attribute for the version of ODBC supported by the driver, but was not supported by the driver.
+# <P>(DM) The <I>Attribute</I> argument was SQL_ATTR_OUTPUT_NTS, and <I>ValuePtr</I> was SQL_FALSE.</P>
+# </TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Comments</B></P>
+#
+# <P>An application can call <B>SQLSetEnvAttr</B> only if no connection handle is allocated on the environment. All environment attributes successfully set by the application for the environment persist until <B>SQLFreeHandle</B> is called on the environment. More than one environment handle can be allocated simultaneously in ODBC 3<I>.x</I>.</P>
+#
+# <P>The format of information set through <I>ValuePtr</I> depends on the specified <I>Attribute</I>. <B>SQLSetEnvAttr</B> will accept attribute information in one of two different formats: a null-terminated character string or a 32-bit integer value. The format of each is noted in the attribute's description.</P>
+#
+# <P>There are no driver-specific environment attributes.</P>
+#
+# <P>Connection attributes cannot be set by a call to <B>SQLSetEnvAttr</B>. Attempting to do so will return SQLSTATE HY092 (Invalid attribute/option identifier).</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=35%><I>Attribute</I></TH>
+# <TH width=65%><I>ValuePtr</I> contents</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=35%>SQL_ATTR_CONNECTION_POOLING<BR>
+# (ODBC 3.0)</TD>
+# <TD width=65%>A 32-bit SQLUINTEGER value that enables or disables connection pooling at the environment level. The following values are used:
+# <P>SQL_CP_OFF = Connection pooling is turned off. This is the default.</P>
+#
+# <P>SQL_CP_ONE_PER_DRIVER = A single connection pool is supported for each driver. Every connection in a pool is associated with one driver.</P>
+#
+# <P>SQL_CP_ONE_PER_HENV = A single connection pool is supported for each environment. Every connection in a pool is associated with one environment.</P>
+#
+# <P>Connection pooling is enabled by calling <B>SQLSetEnvAttr</B> to set the SQL_ATTR_CONNECTION_POOLING attribute to SQL_CP_ONE_PER_DRIVER or SQL_CP_ONE_PER_HENV. This call must be made before the application allocates the shared environment for which connection pooling is to be enabled. The environment handle in the call to <B>SQLSetEnvAttr</B> is set to null, which makes SQL_ATTR_CONNECTION_POOLING a process-level attribute. After connection pooling is enabled, the application then allocates an implicit shared environment by calling <B>SQLAllocHandle</B> with the <I>InputHandle</I> argument set to SQL_HANDLE_ENV.</P>
+#
+# <P>After connection pooling has been enabled and a shared environment has been selected for an application, SQL_ATTR_CONNECTION_POOLING cannot be reset for that environment, because <B>SQLSetEnvAttr</B> is called with a null environment handle when setting this attribute. If this attribute is set while connection pooling is already enabled on a shared environment, the attribute affects only shared environments that are allocated subsequently.</P>
+#
+# <P>For more information, see "<A HREF="odbcodbc_connection_pooling.htm">ODBC Connection Pooling</A>" in Chapter 6: Connecting to a Data Source or Driver.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_CONNECTION_POOLING => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_CP_OFF SQL_CP_ONE_PER_DRIVER SQL_CP_ONE_PER_HENV) ],
+ default => q(SQL_CP_OFF),
+ mode => 'rw',
+ order => ++$order,
+ },
+# <TR VALIGN="top">
+# <TD width=35%>SQL_ATTR_CP_MATCH<BR>
+# (ODBC 3.0)</TD>
+# <TD width=65%>A 32-bit SQLUINTEGER value that determines how a connection is chosen from a connection pool. When <B>SQLConnect</B> or <B>SQLDriverConnect</B> is called, the Driver Manager determines which connection is reused from the pool. The Driver Manager attempts to match the connection options in the call and the connection attributes set by the application to the keywords and connection attributes of the connections in the pool. The value of this attribute determines the level of precision of the matching criteria.
+# <P>The following values are used to set the value of this attribute:</P>
+#
+# <P>SQL_CP_STRICT_MATCH = Only connections that exactly match the connection options in the call and the connection attributes set by the application are reused. This is the default.</P>
+#
+# <P>SQL_CP_RELAXED_MATCH = Connections with matching connection string keywords can be used. Keywords must match, but not all connection attributes must match.</P>
+#
+# <P>For more information on how the Driver Manager performs the match in connecting to a pooled connection, see <A HREF="odbcsqlconnect.htm">SQLConnect</A>. For more information on connection pooling, see "<A HREF="odbcodbc_connection_pooling.htm">ODBC Connection Pooling</A>" in Chapter 6: Connecting to a Data Source or Driver.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_CP_MATCH => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_CP_STRICT_MATCH SQL_CP_RELAXED_MATCH) ],
+ default => q(SQL_CP_STRICT_MATCH),
+ mode => 'rw',
+ order => ++$order,
+ },
+# <TR VALIGN="top">
+# <TD width=35%>SQL_ATTR_ODBC_VERSION<BR>
+# (ODBC 3.0)</TD>
+# <TD width=65%>A 32-bit integer that determines whether certain functionality exhibits ODBC 2<I>.x</I> behavior or ODBC 3<I>.x</I> behavior. The following values are used to set the value of this attribute:
+# <P>SQL_OV_ODBC3 = The Driver Manager and driver exhibit the following ODBC 3<I>.x</I> behavior:
+#
+# <UL type=disc>
+# <LI>The driver returns and expects ODBC 3<I>.x</I> codes for date, time, and timestamp.</li>
+#
+# <LI>The driver returns ODBC 3<I>.x</I> SQLSTATE codes when <B>SQLError</B>, <B>SQLGetDiagField</B>, or <B>SQLGetDiagRec</B> is called.</li>
+#
+# <LI>The <I>CatalogName</I> argument in a call to <B>SQLTables</B> accepts a search pattern.</li>
+# </UL>
+#
+# <P>SQL_OV_ODBC2 = The Driver Manager and driver exhibit the following ODBC 2<I>.x </I>behavior. This is especially useful for an ODBC 2<I>.x</I> application working with an ODBC 3<I>.x</I> driver.
+#
+# <UL type=disc>
+# <LI>The driver returns and expects ODBC 2<I>.x</I> codes for date, time, and timestamp.</li>
+#
+# <LI>The driver returns ODBC 2<I>.x</I> SQLSTATE codes when <B>SQLError</B>, <B>SQLGetDiagField</B>, or <B>SQLGetDiagRec</B> is called.</li>
+#
+# <LI>The <I>CatalogName</I> argument in a call to <B>SQLTables</B> does not accept a search pattern.</li>
+# </UL>
+#
+# <P>An application must set this environment attribute before calling any function that has an SQLHENV argument, or the call will return SQLSTATE HY010 (Function sequence error). It is driver-specific whether or not additional behaviors exist for these environmental flags.
+#
+# <UL type=disc>
+# <LI>For more information, see "<A HREF="odbcdeclaring_the_application_s_odbc_version.htm">Declaring the Application's ODBC Version</A>" in Chapter 6: Connecting to a Data Source or Driver and "<A HREF="odbcbehavioral_changes.htm">Behavioral Changes</A>" in Chapter 17: Programming Considerations.</li>
+# </UL>
+# </TD>
+# </TR>
+ SQL_ATTR_ODBC_VERSION => {
+ type => q(SQLINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_OV_ODBC3 SQL_OV_ODBC2) ],
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+# <TR VALIGN="top">
+# <TD width=35%>SQL_ATTR_OUTPUT_NTS<BR>
+# (ODBC 3.0)</TD>
+# <TD width=65%>A 32-bit integer that determines how the driver returns string data. If SQL_TRUE, the driver returns string data null-terminated. If SQL_FALSE, the driver does not return string data null-terminated.
+# <P>This attribute defaults to SQL_TRUE. A call to <B>SQLSetEnvAttr</B> to set it to SQL_TRUE returns SQL_SUCCESS. A call to <B>SQLSetEnvAttr</B> to set it to SQL_FALSE returns SQL_ERROR and SQLSTATE HYC00 (Optional feature not implemented).</P>
+# </TD>
+# </TR>
+ SQL_ATTR_OUTPUT_NTS => {
+ type => q(SQLINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_FALSE SQL_TRUE) ],
+ default => q(SQL_TRUE),
+ mode => 'rw',
+ order => ++$order,
+ }
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Related Functions</B></P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=48%>For information about</TH>
+# <TH width=52%>See</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>Allocating a handle</TD>
+# <TD width=52%><A HREF="odbcsqlallochandle.htm">SQLAllocHandle</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>Returning the setting of an environment attribute</TD>
+# <TD width=52%><A HREF="odbcsqlgetenvattr.htm">SQLGetEnvAttr</A></TD>
+# </TR>
+# </table></div>
+# <!--TS:--><H4><A NAME="feedback"></A></H4>
+# <SPAN id="SDKFeedB"></SPAN>
+# </div>
+#
+# </BODY>
+# </HTML>
+};
+
+#
+# odbcsqlsetconnectattr.htm
+#
+my $attrDbc = {
+# <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+# <HTML DIR="LTR"><HEAD>
+# <META HTTP-EQUIV="Content-Type" Content="text/html; charset=Windows-1252">
+# <TITLE>SQLSetConnectAttr</TITLE>
+# <SCRIPT SRC="/stylesheets/vs70link.js"></SCRIPT>
+# <SCRIPT SRC="/stylesheets/vs70.js"></SCRIPT>
+# <SCRIPT LANGUAGE="JScript" SRC="/stylesheets/odbc.js"></SCRIPT>
+# </HEAD>
+# <body topmargin=0 id="bodyID">
+#
+# <div id="nsbanner">
+# <div id="bannertitle">
+# <TABLE CLASS="bannerparthead" CELLSPACING=0>
+# <TR ID="hdr">
+# <TD CLASS="bannertitle" nowrap>
+# ODBC Programmer's Reference
+# </TD><TD valign=middle><a href="#Feedback"><IMG name="feedb" onclick=EMailStream(SDKFeedB) style="CURSOR: hand;" hspace=15 alt="" src="/stylesheets/mailto.gif" align=right></a></TD>
+# </TR>
+# </TABLE>
+# </div>
+# </div>
+# <DIV id="nstext" valign="bottom">
+#
+# <H1><A NAME="odbcsqlsetconnectattr"></A>SQLSetConnectAttr</H1>
+#
+# <P class="label"><B>Conformance</B></P>
+#
+# <P>Version Introduced: ODBC 3.0<BR>
+# Standards Compliance: ISO 92</P>
+#
+# <P class="label"><B>Summary</B></P>
+#
+# <P><B>SQLSetConnectAttr</B> sets attributes that govern aspects of connections.</P>
+#
+# <P class="indent"><b class="le">Note</b>&nbsp;&nbsp;&nbsp;For more information about what the Driver Manager maps this function to when an ODBC 3<I>.x</I> application is working with an ODBC 2<I>.x</I> driver, see "<A HREF="odbcmapping_replacement_functions_for_backward_compatibility_of_applications.htm">Mapping Replacement Functions for Backward Compatibility of Applications</A>" in Chapter 17: Programming Considerations.</P>
+#
+# <P class="label"><B>Syntax</B></P>
+#
+# <PRE class="syntax">SQLRETURN <B>SQLSetConnectAttr</B>(
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLHDBC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>ConnectionHandle</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLINTEGER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>Attribute</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLPOINTER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>ValuePtr</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLINTEGER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>StringLength</I>);</PRE>
+#
+# <P class="label"><B>Arguments</B>
+#
+# <DL>
+# <DT><I>ConnectionHandle</I></DT>
+#
+# <DD>[Input]<BR>
+# Connection handle.</dd>
+#
+# <DT><I>Attribute</I></DT>
+#
+# <DD>[Input]<BR>
+# Attribute to set, listed in "Comments."</dd>
+#
+# <DT><I>ValuePtr</I></DT>
+#
+# <DD>[Input]<BR>
+# Pointer to the value to be associated with <I>Attribute</I>. Depending on the value of <I>Attribute</I>, <I>ValuePtr</I> will be a 32-bit unsigned integer value or will point to a null-terminated character string. Note that if the <I>Attribute</I> argument is a driver-specific value, the value in <I>ValuePtr</I> may be a signed integer.</dd>
+#
+# <DT><I>StringLength</I></DT>
+#
+# <DD>[Input]<BR>
+# If <I>Attribute</I> is an ODBC-defined attribute and <I>ValuePtr</I> points to a character string or a binary buffer, this argument should be the length of *<I>ValuePtr</I>. If <I>Attribute</I> is an ODBC-defined attribute and <I>ValuePtr</I> is an integer, <I>StringLength</I> is ignored.
+#
+# <P>If <I>Attribute</I> is a driver-defined attribute, the application indicates the nature of the attribute to the Driver Manager by setting the <I>StringLength</I> argument. <I>StringLength</I> can have the following values:
+#
+#
+# <UL type=disc>
+# <LI>If <I>ValuePtr</I> is a pointer to a character string, then <I>StringLength</I> is the length of the string or SQL_NTS.</li>
+#
+# <LI>If <I>ValuePtr</I> is a pointer to a binary buffer, then the application places the result of the SQL_LEN_BINARY_ATTR(<I>length</I>) macro in <I>StringLength</I>. This places a negative value in <I>StringLength</I>.</li>
+#
+# <LI>If <I>ValuePtr</I> is a pointer to a value other than a character string or a binary string, then <I>StringLength</I> should have the value SQL_IS_POINTER.</li>
+#
+# <LI>If <I>ValuePtr</I> contains a fixed-length value, then <I>StringLength</I> is either SQL_IS_INTEGER or SQL_IS_UINTEGER, as appropriate.</li>
+# </UL>
+# </dd>
+# </DL>
+#
+# <P class="label"><B>Returns</B></P>
+#
+# <P>SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or SQL_INVALID_HANDLE.</P>
+#
+# <P class="label"><B>Diagnostics</B></P>
+#
+# <P>When <B>SQLSetConnectAttr</B> returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value can be obtained by calling <B>SQLGetDiagRec</B> with a <I>HandleType</I> of SQL_HANDLE_DBC and a <I>Handle</I> of <I>ConnectionHandle</I>. The following table lists the SQLSTATE values commonly returned by <B>SQLSetConnectAttr</B> and explains each one in the context of this function; the notation "(DM)" precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.</P>
+#
+# <P>The driver can return SQL_SUCCESS_WITH_INFO to provide information about the result of setting an option.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=22%>SQLSTATE</TH>
+# <TH width=26%>Error</TH>
+# <TH width=52%>Description</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>01000</TD>
+# <TD width=26%>General warning</TD>
+# <TD width=52%>Driver-specific informational message. (Function returns SQL_SUCCESS_WITH_INFO.)</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>01S02</TD>
+# <TD width=26%>Option value changed</TD>
+# <TD width=52%>The driver did not support the value specified in <I>ValuePtr</I> and substituted a similar value. (Function returns SQL_SUCCESS_WITH_INFO.)</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>08002</TD>
+# <TD width=26%>Connection name in use</TD>
+# <TD width=52%>The <I>Attribute</I> argument was SQL_ATTR_ODBC_CURSORS, and the driver was already connected to the data source.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>08003</TD>
+# <TD width=26%>Connection does not exist</TD>
+# <TD width=52%>(DM) An <I>Attribute</I> value was specified that required an open connection, but the <I>ConnectionHandle</I> was not in a connected state.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>08S01</TD>
+# <TD width=26%>Communication link failure</TD>
+# <TD width=52%>The communication link between the driver and the data source to which the driver was connected failed before the function completed processing.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>24000</TD>
+# <TD width=26%>Invalid cursor state</TD>
+# <TD width=52%>The <I>Attribute</I> argument was SQL_ATTR_CURRENT_CATALOG, and a result set was pending.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>3D000</TD>
+# <TD width=26%>Invalid catalog name</TD>
+# <TD width=52%>The <I>Attribute</I> argument was SQL_CURRENT_CATALOG, and the specified catalog name was invalid.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY000</TD>
+# <TD width=26%>General error</TD>
+# <TD width=52%>An error occurred for which there was no specific SQLSTATE and for which no implementation-specific SQLSTATE was defined. The error message returned by <B>SQLGetDiagRec</B> in the <I>*MessageText</I> buffer describes the error and its cause.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY001</TD>
+# <TD width=26%>Memory allocation error</TD>
+# <TD width=52%>The driver was unable to allocate memory required to support execution or completion of the function.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY009</TD>
+# <TD width=26%>Invalid use of null pointer</TD>
+# <TD width=52%>The <I>Attribute</I> argument identified a connection attribute that required a string value, and the <I>ValuePtr </I>argument was a null pointer.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY010</TD>
+# <TD width=26%>Function sequence error</TD>
+# <TD width=52%>(DM) An asynchronously executing function was called for a <I>StatementHandle</I> associated with the <I>ConnectionHandle</I> and was still executing when <B>SQLSetConnectAttr</B> was called.
+# <P>(DM) <B>SQLExecute</B>, <B>SQLExecDirect</B>, <B>SQLBulkOperations</B>, or <B>SQLSetPos</B> was called for a <I>StatementHandle</I> associated with the <I>ConnectionHandle</I> and returned SQL_NEED_DATA. This function was called before data was sent for all data-at-execution parameters or columns.</P>
+#
+# <P>(DM) <B>SQLBrowseConnect</B> was called for the <I>ConnectionHandle</I> and returned SQL_NEED_DATA. This function was called before <B>SQLBrowseConnect</B> returned SQL_SUCCESS_WITH_INFO or SQL_SUCCESS.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY011</TD>
+# <TD width=26%>Attribute cannot be set now</TD>
+# <TD width=52%>The <I>Attribute</I> argument was SQL_ATTR_TXN_ISOLATION, and a transaction was open.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY013</TD>
+# <TD width=26%>Memory management error</TD>
+# <TD width=52%>The function call could not be processed because the underlying memory objects could not be accessed, possibly because of low memory conditions.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY024</TD>
+# <TD width=26%>Invalid attribute value</TD>
+# <TD width=52%>Given the specified <I>Attribute</I> value, an invalid value was specified in <I>ValuePtr</I>. (The Driver Manager returns this SQLSTATE only for connection and statement attributes that accept a discrete set of values, such as SQL_ATTR_ACCESS_MODE or SQL_ATTR_ASYNC_ENABLE. For all other connection and statement attributes, the driver must verify the value specified in <I>ValuePtr</I>.)
+# <P>The <I>Attribute</I> argument was SQL_ATTR_TRACEFILE or SQL_ATTR_TRANSLATE_LIB, and <I>ValuePtr</I> was an empty string.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY090</TD>
+# <TD width=26%>Invalid string or buffer length</TD>
+# <TD width=52%><I>(DM) *ValuePtr </I>is a character string, and the <I>StringLength</I> argument was less than 0 but was not SQL_NTS.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY092</TD>
+# <TD width=26%>Invalid attribute/option identifier</TD>
+# <TD width=52%>(DM) The value specified for the argument <I>Attribute</I> was not valid for the version of ODBC supported by the driver.
+# <P>(DM) The value specified for the argument <I>Attribute</I> was a read-only attribute.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYC00</TD>
+# <TD width=26%>Optional feature not implemented</TD>
+# <TD width=52%>The value specified for the argument <I>Attribute</I> was a valid ODBC connection or statement attribute for the version of ODBC supported by the driver but was not supported by the driver.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYT01</TD>
+# <TD width=26%>Connection timeout expired</TD>
+# <TD width=52%>The connection timeout period expired before the data source responded to the request. The connection timeout period is set through <B>SQLSetConnectAttr</B>, SQL_ATTR_CONNECTION_TIMEOUT.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>IM001</TD>
+# <TD width=26%>Driver does not support this function</TD>
+# <TD width=52%>(DM) The driver associated with the <I>ConnectionHandle</I> does not support the function.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>IM009</TD>
+# <TD width=26%>Unable to load translation DLL</TD>
+# <TD width=52%>The driver was unable to load the translation DLL that was specified for the connection. This error can be returned only when <I>Attribute</I> is SQL_ATTR_TRANSLATE_LIB.</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P>When <I>Attribute</I> is a statement attribute, <B>SQLSetConnectAttr</B> can return any SQLSTATEs returned by <B>SQLSetStmtAttr</B>.</P>
+#
+# <P class="label"><B>Comments</B></P>
+#
+# <P>For general information about connection attributes, see "<A HREF="odbcconnection_attributes.htm">Connection Attributes</A>" in Chapter 6: Connecting to a Data Source or Driver.</P>
+#
+# <P>The currently defined attributes and the version of ODBC in which they were introduced are shown in the table later in this section; it is expected that more attributes will be defined to take advantage of different data sources. A range of attributes is reserved by ODBC; driver developers must reserve values for their own driver-specific use from X/Open.</P>
+#
+# <P class="indent"><b class="le">Note</b>&nbsp;&nbsp;&nbsp;The ability to set statement attributes at the connection level by calling <B>SQLSetConnectAttr</B> has been deprecated in ODBC 3<I>.x</I>. ODBC 3<I>.x</I> applications should never set statement attributes at the connection level. ODBC 3<I>.x</I> statement attributes cannot be set at the connection level, with the exception of the SQL_ATTR_METADATA_ID and SQL_ATTR_ASYNC_ENABLE attributes, which are both connection attributes and statement attributes and can be set at either the connection level or the statement level.</P>
+#
+# <P class="indent">ODBC 3<I>.x</I> drivers need only support this functionality if they should work with ODBC 2<I>.x</I> applications that set ODBC 2<I>.x</I> statement options at the connection level. For more information, see "<A HREF="odbcsqlsetconnectoption_mapping.htm">SQLSetConnectOption Mapping</A>" in Appendix G: Driver Guidelines for Backward Compatibility.</P>
+#
+# <P>An application can call <B>SQLSetConnectAttr</B> at any time between the time the connection is allocated and freed. All connection and statement attributes successfully set by the application for the connection persist until <B>SQLFreeHandle</B> is called on the connection. For example, if an application calls <B>SQLSetConnectAttr</B> before connecting to a data source, the attribute persists even if <B>SQLSetConnectAttr</B> fails in the driver when the application connects to the data source; if an application sets a driver-specific attribute, the attribute persists even if the application connects to a different driver on the connection.</P>
+#
+# <P>Some connection attributes can be set only before a connection has been made; others can be set only after a connection has been made. The following table indicates those connection attributes that must be set either before or after a connection has been made. <I>Either</I> indicates that the attribute can be set either before or after connection.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=50%>Attribute</TH>
+# <TH width=50%>Set before or after connection?</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ATTR_ACCESS_MODE</TD>
+# <TD width=50%>Either<SUP>[1]</SUP></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ATTR_ASYNC_ENABLE</TD>
+# <TD width=50%>Either<SUP>[2]</SUP></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ATTR_AUTOCOMMIT</TD>
+# <TD width=50%>Either</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ATTR_CONNECTION_TIMEOUT</TD>
+# <TD width=50%>Either</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ATTR_CURRENT_CATALOG</TD>
+# <TD width=50%>Either<SUP>[1]</SUP></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ATTR_LOGIN_TIMEOUT</TD>
+# <TD width=50%>Before</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ATTR_METADATA_ID</TD>
+# <TD width=50%>Either</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ATTR_ODBC_CURSORS</TD>
+# <TD width=50%>Before</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ATTR_PACKET_SIZE</TD>
+# <TD width=50%>Before</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ATTR_QUIET_MODE</TD>
+# <TD width=50%>Either</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ATTR_TRACE</TD>
+# <TD width=50%>Either</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ATTR_TRACEFILE</TD>
+# <TD width=50%>Either</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ATTR_TRANSLATE_LIB</TD>
+# <TD width=50%>After</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ATTR_TRANSLATE_OPTION</TD>
+# <TD width=50%>After</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>SQL_ATTR_TXN_ISOLATION</TD>
+# <TD width=50%>Either<SUP>[3]</SUP></TD>
+# </TR>
+# </table></div>
+#
+# <P class="fineprint">[1]&nbsp;&nbsp;&nbsp;SQL_ATTR_ACCESS_MODE and SQL_ATTR_CURRENT_CATALOG can be set before or after connecting, depending on the driver. However, interoperable applications set them before connecting because some drivers do not support changing these after connecting.</p>
+# <P class="fineprint">[2]&nbsp;&nbsp;&nbsp;SQL_ATTR_ASYNC_ENABLE must be set before there is an active statement.</p>
+# <P class="fineprint">[3]&nbsp;&nbsp;&nbsp;SQL_ATTR_TXN_ISOLATION can be set only if there are no open transactions on the connection. Some connection attributes support substitution of a similar value if the data source does not support the value specified in *<I>ValuePtr</I>. In such cases, the driver returns SQL_SUCCESS_WITH_INFO and SQLSTATE 01S02 (Option value changed). For example, if <I>Attribute</I> is SQL_ATTR_PACKET_SIZE and *<I>ValuePtr</I> exceeds the maximum packet size, the driver substitutes the maximum size. To determine the substituted value, an application calls <B>SQLGetConnectAttr</B>.</p>
+# <P>The format of information set in the *<I>ValuePtr</I> buffer depends on the specified <I>Attribute</I>. <B>SQLSetConnectAttr</B> will accept attribute information in one of two different formats: a null-terminated character string or a 32-bit integer value. The format of each is noted in the attribute's description. Character strings pointed to by the <I>ValuePtr</I> argument of <B>SQLSetConnectAttr</B> have a length of <I>StringLength</I> bytes.</P>
+#
+# <P>The <I>StringLength</I> argument is ignored if the length is defined by the attribute, as is the case for all attributes introduced in ODBC 2<I>.x</I> or earlier.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=38%><I>Attribute</I></TH>
+# <TH width=62%><I>ValuePtr</I> contents</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_ACCESS_MODE<BR>
+# (ODBC 1.0)</TD>
+# <TD width=62%>An SQLUINTEGER value. SQL_MODE_READ_ONLY is used by the driver or data source as an indicator that the connection is not required to support SQL statements that cause updates to occur. This mode can be used to optimize locking strategies, transaction management, or other areas as appropriate to the driver or data source. The driver is not required to prevent such statements from being submitted to the data source. The behavior of the driver and data source when asked to process SQL statements that are not read-only during a read-only connection is implementation-defined. SQL_MODE_READ_WRITE is the default.</TD>
+# </TR>
+ SQL_ATTR_ACCESS_MODE => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_MODE_READ_ONLY SQL_MODE_READ_WRITE) ],
+ default => q(SQL_MODE_READ_WRITE),
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_ASYNC_ENABLE<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that specifies whether a function called with a statement on the specified connection is executed asynchronously:
+# <P>SQL_ASYNC_ENABLE_OFF = Off (the default)<BR>
+# SQL_ASYNC_ENABLE_ON = On</P>
+#
+# <P>Setting SQL_ASYNC_ENABLE_ON enables asynchronous execution for all future statement handles allocated on this connection. It is driver-defined whether this enables asynchronous execution for existing statement handles associated with this connection. An error is returned if asynchronous execution is enabled while there is an active statement on the connection.</P>
+#
+# <P>This attribute can be set whether <B>SQLGetInfo</B> with the SQL_ASYNC_MODE information type returns SQL_AM_CONNECTION or SQL_AM_STATEMENT.</P>
+#
+# <P>After a function has been called asynchronously, only the original function, <B>SQLAllocHandle</B>, <B>SQLCancel</B>, <B>SQLGetDiagField</B>, or <B>SQLGetDiagRec </B>can be called on the statement or the connection associated with <I>StatementHandle</I>, until the original function returns a code other than SQL_STILL_EXECUTING. Any other function called on <I>StatementHandle</I> or the connection associated with <I>StatementHandle</I> returns SQL_ERROR with an SQLSTATE of HY010 (Function sequence error). Functions can be called on other statements. For more information, see "<A HREF="odbcasynchronous_execution.htm">Asynchronous Execution</A>" in Chapter 9: Executing Statements.</P>
+#
+# <P>In general, applications should execute functions asynchronously only on single-thread operating systems. On multithread operating systems, applications should execute functions on separate threads rather than executing them asynchronously on the same thread. Drivers that operate only on multithread operating systems do not need to support asynchronous execution.</P>
+#
+# <P>The following functions can be executed asynchronously:</P>
+#
+# <P><B>SQLBulkOperations<BR>
+# SQLColAttribute</B><BR>
+# <B>SQLColumnPrivileges</B><BR>
+# <B>SQLColumns</B><BR>
+# <B>SQLCopyDesc</B><BR>
+# <B>SQLDescribeCol</B><BR>
+# <B>SQLDescribeParam</B><BR>
+# <B>SQLExecDirect</B><BR>
+# <B>SQLExecute</B><BR>
+# <B>SQLFetch</B><BR>
+# <B>SQLFetchScroll</B><BR>
+# <B>SQLForeignKeys</B><BR>
+# <B>SQLGetData</B><BR>
+# <B>SQLGetDescField</B><SUP>[1]<BR>
+# </SUP><B>SQLGetDescRec</B><SUP>[1]</SUP><B><BR>
+# SQLGetDiagField</B><BR>
+# <B>SQLGetDiagRec<BR>
+# SQLGetTypeInfo</B><BR>
+# <B>SQLMoreResults</B><BR>
+# <B>SQLNumParams</B><BR>
+# <B>SQLNumResultCols</B><BR>
+# <B>SQLParamData</B><BR>
+# <B>SQLPrepare</B><BR>
+# <B>SQLPrimaryKeys</B><BR>
+# <B>SQLProcedureColumns</B><BR>
+# <B>SQLProcedures</B><BR>
+# <B>SQLPutData</B><BR>
+# <B>SQLSetPos</B><BR>
+# <B>SQLSpecialColumns</B><BR>
+# <B>SQLStatistics</B><BR>
+# <B>SQLTablePrivileges</B><BR>
+# <B>SQLTables</B></P>
+# </TD>
+# </TR>
+ SQL_ASYNC_ENABLE_ON => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_ASYNC_ENABLE_OFF SQL_ASYNC_ENABLE_ON) ],
+ default => q(SQL_ASYNC_ENABLE_OFF),
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_AUTO_IPD<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>A read-only SQLUINTEGER value that specifies whether automatic population of the IPD after a call to <B>SQLPrepare </B>is supported:
+# <P>SQL_TRUE = Automatic population of the IPD after a call to <B>SQLPrepare </B>is supported by the driver.</P>
+#
+# <P>SQL_FALSE = Automatic population of the IPD after a call to <B>SQLPrepare </B>is not supported by the driver. Servers that do not support prepared statements will not be able to populate the IPD automatically. </P>
+#
+# <P>If SQL_TRUE is returned for the SQL_ATTR_AUTO_IPD connection attribute, the statement attribute SQL_ATTR_ENABLE_AUTO_IPD can be set to turn automatic population of the IPD on or off. If SQL_ATTR_AUTO_IPD is SQL_FALSE, SQL_ATTR_ENABLE_AUTO_IPD cannot be set to SQL_TRUE. The default value of SQL_ATTR_ENABLE_AUTO_IPD is equal to the value of SQL_ATTR_AUTO_IPD.</P>
+#
+# <P>This connection attribute can be returned by <B>SQLGetConnectAttr</B> but cannot be set by <B>SQLSetConnectAttr</B>.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_AUTO_IPD => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_FALSE SQL_TRUE) ],
+ default => undef,
+ mode => 'ro',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_AUTOCOMMIT<BR>
+# (ODBC 1.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that specifies whether to use autocommit or manual-commit mode:
+# <P>SQL_AUTOCOMMIT_OFF = The driver uses manual-commit mode, and the application must explicitly commit or roll back transactions with <B>SQLEndTran</B>.</P>
+#
+# <P>SQL_AUTOCOMMIT_ON = The driver uses autocommit mode. Each statement is committed immediately after it is executed. This is the default. Any open transactions on the connection are committed when SQL_ATTR_AUTOCOMMIT is set to SQL_AUTOCOMMIT_ON to change from manual-commit mode to autocommit mode.</P>
+#
+# <P>For more information, see "<A HREF="odbccommit_mode.htm">Commit Mode</A>" in Chapter 14: Transactions.</P>
+#
+# <P class="indent"><b class="le">Important&nbsp;&nbsp;&nbsp;</b>Some data sources delete the access plans and close the cursors for all statements on a connection each time a statement is committed; autocommit mode can cause this to happen after each nonquery statement is executed or when the cursor is closed for a query. For more information, see the SQL_CURSOR_COMMIT_BEHAVIOR and SQL_CURSOR_ROLLBACK_BEHAVIOR information types in <A HREF="odbcsqlgetinfo.htm">SQLGetInfo</A> and "<A HREF="odbceffect_of_transactions_on_cursors_and_prepared_statements.htm">Effect of Transactions on Cursors and Prepared Statements</A>" in Chapter 14: Transactions.</P>
+#
+# <P>When a batch is executed in autocommit mode, two things are possible. The entire batch can be treated as an autocommitable unit, or each statement in a batch is treated as an autocommitable unit. Certain data sources can support both these behaviors and may provide a way of choosing one or the other. It is driver-defined whether a batch is treated as an autocommitable unit or whether each individual statement within the batch is autocommitable.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_AUTOCOMMIT => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_AUTOCOMMIT_OFF SQL_AUTOCOMMIT_ON) ],
+ default => q(SQL_AUTOCOMMIT_ON),
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_CONNECTION_DEAD
+# <P>(ODBC 3.5)</P>
+# </TD>
+# <TD width=62%>An SQLUINTERGER value that indicates the state of the connection. If SQL_CD_TRUE, the connection has been lost. If SQL_CD_FALSE, the connection is still active.</TD>
+# </TR>
+ SQL_ATTR_CONNECTION_DEAD => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_CD_FALSE SQL_CD_TRUE) ],
+ default => undef,
+ mode => 'ro',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_CONNECTION_TIMEOUT<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>An SQLUINTEGER value corresponding to the number of seconds to wait for any request on the connection to complete before returning to the application. The driver should return SQLSTATE HYT00 (Timeout expired) anytime that it is possible to time out in a situation not associated with query execution or login.
+# <P>If <I>ValuePtr</I> is equal to 0 (the default), there is no timeout.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_CONNECTION_TIMEOUT => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => undef,
+ default => 0,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_CURRENT_CATALOG<BR>
+# (ODBC 2.0)</TD>
+# <TD width=62%>A character string containing the name of the catalog to be used by the data source. For example, in SQL Server, the catalog is a database, so the driver sends a <B>USE</B> <I>database</I> statement to the data source, where <I>database</I> is the database specified in *<I>ValuePtr</I>. For a single-tier driver, the catalog might be a directory, so the driver changes its current directory to the directory specified in *<I>ValuePtr</I>.</TD>
+# </TR>
+ SQL_ATTR_CURRENT_CATALOG => {
+ type => q(SQLCHAR),
+ ptr => undef,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_LOGIN_TIMEOUT<BR>
+# (ODBC 1.0)</TD>
+# <TD width=62%>An SQLUINTEGER value corresponding to the number of seconds to wait for a login request to complete before returning to the application. The default is driver-dependent. If <I>ValuePtr</I> is 0, the timeout is disabled and a connection attempt will wait indefinitely.
+# <P>If the specified timeout exceeds the maximum login timeout in the data source, the driver substitutes that value and returns SQLSTATE 01S02 (Option value changed).</P>
+# </TD>
+# </TR>
+ SQL_ATTR_LOGIN_TIMEOUT => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => undef,
+ default => 0,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_METADATA_ID<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that determines how the string arguments of catalog functions are treated.
+# <P>If SQL_TRUE, the string argument of catalog functions are treated as identifiers. The case is not significant. For nondelimited strings, the driver removes any trailing spaces and the string is folded to uppercase. For delimited strings, the driver removes any leading or trailing spaces and takes literally whatever is between the delimiters. If one of these arguments is set to a null pointer, the function returns SQL_ERROR and SQLSTATE HY009 (Invalid use of null pointer). </P>
+#
+# <P>If SQL_FALSE, the string arguments of catalog functions are not treated as identifiers. The case is significant. They can either contain a string search pattern or not, depending on the argument.</P>
+#
+# <P>The default value is SQL_FALSE.</P>
+#
+# <P>The <I>TableType</I> argument of <B>SQLTables</B>, which takes a list of values, is not affected by this attribute.</P>
+#
+# <P>SQL_ATTR_METADATA_ID can also be set on the statement level. (It is the only connection attribute that is also a statement attribute.)</P>
+#
+# <P>For more information, see "<A HREF="odbcarguments_in_catalog_functions.htm">Arguments in Catalog Functions</A>" in Chapter 7: Catalog Functions.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_METADATA_ID => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_FALSE SQL_TRUE) ],
+ default => q(SQL_FALSE),
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_ODBC_CURSORS<BR>
+# (ODBC 2.0)</TD>
+# <TD width=62%>An SQLUINTEGER value specifying how the Driver Manager uses the ODBC cursor library:
+# <P>SQL_CUR_USE_IF_NEEDED = The Driver Manager uses the ODBC cursor library only if it is needed. If the driver supports the SQL_FETCH_PRIOR option in <B>SQLFetchScroll</B>, the Driver Manager uses the scrolling capabilities of the driver. Otherwise, it uses the ODBC cursor library.</P>
+#
+# <P>SQL_CUR_USE_ODBC = The Driver Manager uses the ODBC cursor library.</P>
+#
+# <P>SQL_CUR_USE_DRIVER = The Driver Manager uses the scrolling capabilities of the driver. This is the default setting.</P>
+#
+# <P>For more information about the ODBC cursor library, see <A HREF="odbcodbc_cursor_library.htm">Appendix F: ODBC Cursor Library</A>.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_ODBC_CURSORS => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_CUR_USE_IF_NEEDED SQL_CUR_USE_ODBC SQL_CUR_USE_DRIVER) ],
+ default => q(SQL_CUR_USE_DRIVER),
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_PACKET_SIZE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=62%>An SQLUINTEGER value specifying the network packet size in bytes.
+# <P class="indent"><B>Note</B>&nbsp;&nbsp;&nbsp;Many data sources either do not support this option or only can return but not set the network packet size.</P>
+#
+# <P>If the specified size exceeds the maximum packet size or is smaller than the minimum packet size, the driver substitutes that value and returns SQLSTATE 01S02 (Option value changed).</P>
+#
+# <P>If the application sets packet size after a connection has already been made, the driver will return SQLSTATE HY011 (Attribute cannot be set now).</P>
+# </TD>
+# </TR>
+ SQL_ATTR_PACKET_SIZE => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_QUIET_MODE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=62%>A 32-bit window handle (<I>hwnd</I>).
+# <P>If the window handle is a null pointer, the driver does not display any dialog boxes.</P>
+#
+# <P>If the window handle is not a null pointer, it should be the parent window handle of the application. This is the default. The driver uses this handle to display dialog boxes.</P>
+#
+# <P class="indent"><b class="le">Note&nbsp;&nbsp;&nbsp;</b>The SQL_ATTR_QUIET_MODE connection attribute does not apply to dialog boxes displayed by <B>SQLDriverConnect</B>.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_QUIET_MODE => {
+ type => q(SQLPOINTER),
+ ptr => undef,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_TRACE<BR>
+# (ODBC 1.0)</TD>
+# <TD width=62%>An SQLUINTEGER value telling the Driver Manager whether to perform tracing:
+# <P>SQL_OPT_TRACE_OFF = Tracing off (the default)</P>
+#
+# <P>SQL_OPT_TRACE_ON = Tracing on</P>
+#
+# <P>When tracing is on, the Driver Manager writes each ODBC function call to the trace file.</P>
+#
+# <P class="indent"><b class="le">Note&nbsp;&nbsp;&nbsp;</b>When tracing is on, the Driver Manager can return SQLSTATE IM013 (Trace file error) from any function.</P>
+#
+# <P>An application specifies a trace file with the SQL_ATTR_TRACEFILE option. If the file already exists, the Driver Manager appends to the file. Otherwise, it creates the file. If tracing is on and no trace file has been specified, the Driver Manager writes to the file SQL.LOG in the root directory. </P>
+#
+# <P>An application can set the variable <B>ODBCSharedTraceFlag</B> to enable tracing dynamically. Tracing is then enabled for all ODBC applications currently running. If an application turns tracing off, it is turned off only for that application.</P>
+#
+# <P>If the <B>Trace</B> keyword in the system information is set to 1 when an application calls <B>SQLAllocHandle</B> with a <I>HandleType</I> of SQL_HANDLE_ENV, tracing is enabled for all handles. It is enabled only for the application that called <B>SQLAllocHandle</B>.</P>
+#
+# <P>Calling <B>SQLSetConnectAttr</B> with an <I>Attribute</I> of SQL_ATTR_TRACE does not require that the <I>ConnectionHandle</I> argument be valid and will not return SQL_ERROR if <I>ConnectionHandle</I> is NULL. This attribute applies to all connections.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_TRACE => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_OPT_TRACE_OFF SQL_OPT_TRACE_ON) ],
+ default => q(SQL_OPT_TRACE_OFF),
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_TRACEFILE<BR>
+# (ODBC 1.0)</TD>
+# <TD width=62%>A null-terminated character string containing the name of the trace file.
+# <P>The default value of the SQL_ATTR_TRACEFILE attribute is specified with the <B>TraceFile</B> keyword in the system information. For more information, see "<A HREF="odbcodbc_subkey.htm">ODBC Subkey</A>" in Chapter 19: Configuring Data Sources.</P>
+#
+# <P>Calling <B>SQLSetConnectAttr</B> with an <I>Attribute</I> of SQL_ATTR_ TRACEFILE does not require the <I>ConnectionHandle</I> argument to be valid and will not return SQL_ERROR if <I>ConnectionHandle</I> is invalid. This attribute applies to all connections.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_TRACEFILE => {
+ type => q(SQLCHAR),
+ ptr => undef,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_TRANSLATE_LIB<BR>
+# (ODBC 1.0)</TD>
+# <TD width=62%>A null-terminated character string containing the name of a library containing the functions <B>SQLDriverToDataSource</B> and <B>SQLDataSourceToDriver</B> that the driver accesses to perform tasks such as character set translation. This option may be specified only if the driver has connected to the data source. The setting of this attribute will persist across connections. For more information about translating data, see "<A HREF="odbctranslation_dlls.htm">Translation DLLs</A>" in Chapter 17: Programming Considerations, and <A HREF="odbctranslation_dll_function_reference.htm">Chapter 24: Translation DLL Function Reference</A>.</TD>
+# </TR>
+ SQL_ATTR_TRANSLATE_LIB => {
+ type => q(SQLCHAR),
+ ptr => undef,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_TRANSLATE_OPTION<BR>
+# (ODBC 1.0)</TD>
+# <TD width=62%>A 32-bit flag value that is passed to the translation DLL. This attribute can be specified only if the driver has connected to the data source. For information about translating data, see "<A HREF="odbctranslation_dlls.htm">Translation DLLs</A>" in Chapter 17: Programming Considerations.</TD>
+# </TR>
+ SQL_ATTR_TRANSLATE_OPTION => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_TXN_ISOLATION<BR>
+# (ODBC 1.0)</TD>
+# <TD width=62%>A 32-bit bitmask that sets the transaction isolation level for the current connection. An application must call <B>SQLEndTran</B> to commit or roll back all open transactions on a connection, before calling <B>SQLSetConnectAttr</B> with this option.
+# <P>The valid values for <I>ValuePtr</I> can be determined by calling <B>SQLGetInfo</B> with <I>InfoType</I> equal to SQL_TXN_ISOLATION_OPTIONS.</P>
+#
+# <P>For a description of transaction isolation levels, see the description of the SQL_DEFAULT_TXN_ISOLATION information type in <B>SQLGetInfo</B> and "<A HREF="odbctransaction_isolation_levels.htm">Transaction Isolation Levels</A>" in Chapter 14: Transactions.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_TXN_ISOLATION => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+# </table></div>
+#
+# <P class="fineprint">[1]&nbsp;&nbsp;&nbsp;These functions can be called asynchronously only if the descriptor is an implementation descriptor, not an application descriptor.</p>
+# <P class="label"><B>Code Example</B></P>
+#
+# <P>See <A HREF="odbcsqlconnect.htm">SQLConnect</A>.</P>
+#
+# <P class="label"><B>Related Functions</B></P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=48%>For information about</TH>
+# <TH width=52%>See</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>Allocating a handle</TD>
+# <TD width=52%><A HREF="odbcsqlallochandle.htm">SQLAllocHandle</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>Returning the setting of a connection <BR>
+# attribute</TD>
+# <TD width=52%><A HREF="odbcsqlgetconnectattr.htm">SQLGetConnectAttr</A></TD>
+# </TR>
+# </table></div>
+# <!--TS:--><H4><A NAME="feedback"></A></H4>
+# <SPAN id="SDKFeedB"></SPAN>
+# </div>
+#
+# </BODY>
+# </HTML>
+};
+
+#
+# odbcsqlsetstmtattr.htm
+#
+my $attrStmt = {
+# <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+# <HTML DIR="LTR"><HEAD>
+# <META HTTP-EQUIV="Content-Type" Content="text/html; charset=Windows-1252">
+# <TITLE>SQLSetStmtAttr</TITLE>
+# <SCRIPT SRC="/stylesheets/vs70link.js"></SCRIPT>
+# <SCRIPT SRC="/stylesheets/vs70.js"></SCRIPT>
+# <SCRIPT LANGUAGE="JScript" SRC="/stylesheets/odbc.js"></SCRIPT>
+# </HEAD>
+# <body topmargin=0 id="bodyID">
+#
+# <div id="nsbanner">
+# <div id="bannertitle">
+# <TABLE CLASS="bannerparthead" CELLSPACING=0>
+# <TR ID="hdr">
+# <TD CLASS="bannertitle" nowrap>
+# ODBC Programmer's Reference
+# </TD><TD valign=middle><a href="#Feedback"><IMG name="feedb" onclick=EMailStream(SDKFeedB) style="CURSOR: hand;" hspace=15 alt="" src="/stylesheets/mailto.gif" align=right></a></TD>
+# </TR>
+# </TABLE>
+# </div>
+# </div>
+# <DIV id="nstext" valign="bottom">
+#
+# <H1><A NAME="odbcsqlsetstmtattr"></A>SQLSetStmtAttr</H1>
+#
+# <P class="label"><B>Conformance</B></P>
+#
+# <P>Version Introduced: ODBC 3.0<BR>
+# Standards Compliance: ISO 92</P>
+#
+# <P class="label"><B>Summary</B></P>
+#
+# <P><B>SQLSetStmtAttr</B> sets attributes related to a statement.</P>
+#
+# <P class="indent"><b class="le">Note</b>&nbsp;&nbsp;&nbsp;For more information about what the Driver Manager maps this function to when an ODBC 3<I>.x</I> application is working with an ODBC 2<I>.x</I> driver, see "<A HREF="odbcmapping_replacement_functions_for_backward_compatibility_of_applications.htm">Mapping Replacement Functions for Backward Compatibility of Applications</A>" in Chapter 17: Programming Considerations.</P>
+#
+# <P class="label"><B>Syntax</B></P>
+#
+# <PRE class="syntax">SQLRETURN <B>SQLSetStmtAttr</B>(
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLHSTMT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>StatementHandle</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLINTEGER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>Attribute</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLPOINTER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>ValuePtr</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLINTEGER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>StringLength</I>);</PRE>
+#
+# <P class="label"><B>Arguments</B>
+#
+# <DL>
+# <DT><I>StatementHandle</I></DT>
+#
+# <DD>[Input]<BR>
+# Statement handle.</dd>
+#
+# <DT><I>Attribute</I></DT>
+#
+# <DD>[Input]<BR>
+# Option to set, listed in "Comments."</dd>
+#
+# <DT><I>ValuePtr</I></DT>
+#
+# <DD>[Input]<BR>
+# Pointer to the value to be associated with <I>Attribute</I>. Depending on the value of <I>Attribute</I>, <I>ValuePtr</I> will be a 32-bit unsigned integer value or a pointer to a null-terminated character string, a binary buffer, or a driver-defined value. If the <I>Attribute</I> argument is a driver-specific value, <I>ValuePtr</I> may be a signed integer.</dd>
+#
+# <DT><I>StringLength</I></DT>
+#
+# <DD>[Input]<BR>
+# If <I>Attribute</I> is an ODBC-defined attribute and <I>ValuePtr</I> points to a character string or a binary buffer, this argument should be the length of *<I>ValuePtr</I>. If <I>Attribute</I> is an ODBC-defined attribute and <I>ValuePtr</I> is an integer, <I>StringLength</I> is ignored.
+#
+# <P>If <I>Attribute</I> is a driver-defined attribute, the application indicates the nature of the attribute to the Driver Manager by setting the <I>StringLength</I> argument. <I>StringLength</I> can have the following values:
+# </dd>
+# </DL>
+#
+# <UL type=disc>
+# <LI>If <I>ValuePtr</I> is a pointer to a character string, then <I>StringLength</I> is the length of the string or SQL_NTS.</li>
+#
+# <LI>If <I>ValuePtr</I> is a pointer to a binary buffer, then the application places the result of the SQL_LEN_BINARY_ATTR(<I>length</I>) macro in <I>StringLength</I>. This places a negative value in <I>StringLength</I>.</li>
+#
+# <LI>If <I>ValuePtr</I> is a pointer to a value other than a character string or a binary string, then <I>StringLength</I> should have the value SQL_IS_POINTER. </li>
+#
+# <LI>If <I>ValuePtr</I> contains a fixed-length value, then <I>StringLength</I> is either SQL_IS_INTEGER or SQL_IS_UINTEGER, as appropriate.</li>
+# </UL>
+#
+# <P class="label"><B>Returns</B></P>
+#
+# <P>SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or SQL_INVALID_HANDLE.</P>
+#
+# <P class="label"><B>Diagnostics</B></P>
+#
+# <P>When <B>SQLSetStmtAttr</B> returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value may be obtained by calling <B>SQLGetDiagRec</B> with a <I>HandleType</I> of SQL_HANDLE_STMT and a <I>Handle</I> of <I>StatementHandle</I>. The following table lists the SQLSTATE values commonly returned by <B>SQLSetStmtAttr</B> and explains each one in the context of this function; the notation "(DM)" precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=22%>SQLSTATE</TH>
+# <TH width=26%>Error</TH>
+# <TH width=52%>Description</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>01000</TD>
+# <TD width=26%>General warning</TD>
+# <TD width=52%>Driver-specific informational message. (Function returns SQL_SUCCESS_WITH_INFO.)</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>01S02</TD>
+# <TD width=26%>Option value changed</TD>
+# <TD width=52%>The driver did not support the value specified in <I>ValuePtr</I>, or the value specified in <I>ValuePtr</I> was invalid because of implementation working conditions, so the driver substituted a similar value. (<B>SQLGetStmtAttr</B> can be called to determine the temporarily substituted value.) The substitute value is valid for the <I>StatementHandle</I> until the cursor is closed, at which point the statement attribute reverts to its previous value. The statement attributes that can be changed are:
+# <P>SQL_ ATTR_CONCURRENCY<BR>
+# SQL_ ATTR_CURSOR_TYPE<BR>
+# SQL_ ATTR_KEYSET_SIZE<BR>
+# SQL_ ATTR_MAX_LENGTH<BR>
+# SQL_ ATTR_MAX_ROWS<BR>
+# SQL_ ATTR_QUERY_TIMEOUT <BR>
+# SQL_ATTR_ROW_ARRAY_SIZE<BR>
+# SQL_ ATTR_SIMULATE_CURSOR </P>
+#
+# <P>(Function returns SQL_SUCCESS_WITH_INFO.)</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>08S01</TD>
+# <TD width=26%>Communication link failure</TD>
+# <TD width=52%>The communication link between the driver and the data source to which the driver was connected failed before the function completed processing.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>24000</TD>
+# <TD width=26%>Invalid cursor state</TD>
+# <TD width=52%>The <I>Attribute</I> was SQL_ATTR_CONCURRENCY, SQL_ATTR_CURSOR_TYPE, SQL_ATTR_SIMULATE_CURSOR, or SQL_ATTR_USE_BOOKMARKS, and the cursor was open.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY000</TD>
+# <TD width=26%>General error</TD>
+# <TD width=52%>An error occurred for which there was no specific SQLSTATE and for which no implementation-specific SQLSTATE was defined. The error message returned by <B>SQLGetDiagRec</B> in the <I>*MessageText</I> buffer describes the error and its cause.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY001</TD>
+# <TD width=26%>Memory allocation <BR>
+# error</TD>
+# <TD width=52%>The driver was unable to allocate memory required to support execution or completion of the function.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY009</TD>
+# <TD width=26%>Invalid use of null pointer</TD>
+# <TD width=52%>The <I>Attribute</I> argument identified a statement attribute that required a string attribute, and the <I>ValuePtr </I>argument was a null pointer.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY010</TD>
+# <TD width=26%>Function sequence error</TD>
+# <TD width=52%>(DM) An asynchronously executing function was called for the <I>StatementHandle</I> and was still executing when this function was called.
+# <P>(DM) <B>SQLExecute</B>, <B>SQLExecDirect</B>, <B>SQLBulkOperations</B>, or <B>SQLSetPos</B> was called for the <I>StatementHandle</I> and returned SQL_NEED_DATA. This function was called before data was sent for all data-at-execution parameters or columns.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY011</TD>
+# <TD width=26%>Attribute cannot be set now</TD>
+# <TD width=52%>The <I>Attribute</I> was SQL_ATTR_CONCURRENCY, SQL_ ATTR_CURSOR_TYPE, SQL_ ATTR_SIMULATE_CURSOR, or SQL_ ATTR_USE_BOOKMARKS, and the statement was prepared.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY013</TD>
+# <TD width=26%>Memory management error</TD>
+# <TD width=52%>The function call could not be processed because the underlying memory objects could not be accessed, possibly because of low memory conditions.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY017</TD>
+# <TD width=26%>Invalid use of an automatically allocated descriptor handle</TD>
+# <TD width=52%>(DM) The <I>Attribute</I> argument was SQL_ATTR_IMP_ROW_DESC or SQL_ATTR_IMP_PARAM_DESC.
+# <P>(DM) The <I>Attribute</I> argument was SQL_ATTR_APP_ROW_DESC or SQL_ATTR_APP_PARAM_DESC, and the value in <I>ValuePtr</I> was an implicitly allocated descriptor handle other than the handle originally allocated for the ARD or APD.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY024</TD>
+# <TD width=26%>Invalid attribute value</TD>
+# <TD width=52%>Given the specified <I>Attribute</I> value, an invalid value was specified in <I>ValuePtr</I>. (The Driver Manager returns this SQLSTATE only for connection and statement attributes that accept a discrete set of values, such as SQL_ATTR_ACCESS_MODE or SQL_ ATTR_ASYNC_ENABLE. For all other connection and statement attributes, the driver must verify the value specified in <I>ValuePtr</I>.)
+# <P>The <I>Attribute</I> argument was SQL_ATTR_APP_ROW_DESC or SQL_ATTR_APP_PARAM_DESC, and <I>ValuePtr</I> was an explicitly allocated descriptor handle that is not on the same connection as the <I>StatementHandle</I> argument.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY090</TD>
+# <TD width=26%>Invalid string or buffer length</TD>
+# <TD width=52%>(DM) <I>*ValuePtr</I> is a character string, and the <I>StringLength</I> argument was less than 0 but was not SQL_NTS.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY092</TD>
+# <TD width=26%>Invalid attribute/option identifier</TD>
+# <TD width=52%>(DM) The value specified for the argument <I>Attribute</I> was not valid for the version of ODBC supported by the driver.
+# <P>(DM) The value specified for the argument <I>Attribute</I> was a read-only attribute.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYC00</TD>
+# <TD width=26%>Optional feature not implemented</TD>
+# <TD width=52%>The value specified for the argument <I>Attribute</I> was a valid ODBC statement attribute for the version of ODBC supported by the driver but was not supported by the driver.
+# <P>The <I>Attribute</I> argument was SQL_ATTR_ASYNC_ENABLE, and a call to <B>SQLGetInfo</B> with an <I>InfoType</I> of SQL_ASYNC_MODE returns SQL_AM_CONNECTION.</P>
+#
+# <P>The <I>Attribute</I> argument was SQL_ATTR_ENABLE_AUTO_IPD, and the value of the connection attribute SQL_ATTR_AUTO_IPD was SQL_FALSE.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYT01</TD>
+# <TD width=26%>Connection timeout expired</TD>
+# <TD width=52%>The connection timeout period expired before the data source responded to the request. The connection timeout period is set through <B>SQLSetConnectAttr</B>, SQL_ATTR_CONNECTION_TIMEOUT.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>IM001</TD>
+# <TD width=26%>Driver does not support this function</TD>
+# <TD width=52%>(DM) The driver associated with the <I>StatementHandle</I> does not support the function.</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Comments</B></P>
+#
+# <P>Statement attributes for a statement remain in effect until they are changed by another call to <B>SQLSetStmtAttr</B> or until the statement is dropped by calling <B>SQLFreeHandle</B>. Calling <B>SQLFreeStmt</B> with the SQL_CLOSE, SQL_UNBIND, or SQL_RESET_PARAMS option does not reset statement attributes.</P>
+#
+# <P>Some statement attributes support substitution of a similar value if the data source does not support the value specified in <I>ValuePtr</I>. In such cases, the driver returns SQL_SUCCESS_WITH_INFO and SQLSTATE 01S02 (Option value changed). For example, if <I>Attribute</I> is SQL_ATTR_CONCURRENCY and <I>ValuePtr</I> is SQL_CONCUR_ROWVER, and if the data source does not support this, the driver substitutes SQL_CONCUR_VALUES and returns SQL_SUCCESS_WITH_INFO. To determine the substituted value, an application calls <B>SQLGetStmtAttr</B>.</P>
+#
+# <P>The format of information set with <I>ValuePtr</I> depends on the specified <I>Attribute</I>. <B>SQLSetStmtAttr</B> accepts attribute information in one of two different formats: a character string or a 32-bit integer value. The format of each is noted in the attribute's description. This format applies to the information returned for each attribute in <B>SQLGetStmtAttr</B>. Character strings pointed to by the <I>ValuePtr</I> argument of <B>SQLSetStmtAttr</B> have a length of <I>StringLength</I>.</P>
+#
+# <P class="indent"><b class="le">Note</b>&nbsp;&nbsp;&nbsp;The ability to set statement attributes at the connection level by calling <B>SQLSetConnectAttr</B> has been deprecated in ODBC 3<I>.x</I>. ODBC 3<I>.x</I> applications should never set statement attributes at the connection level. ODBC 3<I>.x</I> statement attributes cannot be set at the connection level, with the exception of the SQL_ATTR_METADATA_ID and SQL_ATTR_ASYNC_ENABLE attributes, which are both connection attributes and statement attributes, and can be set at either the connection level or the statement level.</P>
+#
+# <P class="indent">ODBC 3<I>.x</I> drivers need only support this functionality if they should work with ODBC 2<I>.x</I> applications that set ODBC 2<I>.x</I> statement options at the connection level. For more information, see "Setting Statement Options on the Connection Level" under "<A HREF="odbcsqlsetconnectoption_mapping.htm">SQLSetConnectOption Mapping</A>" in Appendix G: Driver Guidelines for Backward Compatibility.</P>
+#
+# <H1>Statement Attributes That Set Descriptor Fields</H1>
+#
+# <P>Many statement attributes correspond to a header field of a descriptor. Setting these attributes actually results in the setting of the descriptor fields. Setting fields by a call to <B>SQLSetStmtAttr</B> rather than to <B>SQLSetDescField</B> has the advantage that a descriptor handle does not have to be obtained for the function call.</P>
+#
+# <P class="indent"><b class="le">Caution</b>&nbsp;&nbsp;&nbsp;Calling <B>SQLSetStmtAttr</B> for one statement can affect other statements. This occurs when the APD or ARD associated with the statement is explicitly allocated and is also associated with other statements. Because <B>SQLSetStmtAttr</B> modifies the APD or ARD, the modifications apply to all statements with which this descriptor is associated. If this is not the required behavior, the application should dissociate this descriptor from the other statements (by calling <B>SQLSetStmtAttr</B> to set the SQL_ATTR_APP_ROW_DESC or SQL_ATTR_APP_PARAM_DESC field to a different descriptor handle) before calling <B>SQLSetStmtAttr</B> again.</P>
+#
+# <P>When a descriptor field is set as a result of the corresponding statement attribute being set, the field is set only for the applicable descriptors that are currently associated with the statement identified by the <I>StatementHandle</I> argument, and the attribute setting does not affect any descriptors that may be associated with that statement in the future. When a descriptor field that is also a statement attribute is set by a call to <B>SQLSetDescField</B>, the corresponding statement attribute is set. If an explicitly allocated descriptor is dissociated from a statement, a statement attribute that corresponds to a header field will revert to the value of the field in the implicitly allocated descriptor.</P>
+#
+# <P>When a statement is allocated (see <A HREF="odbcsqlallochandle.htm">SQLAllocHandle</A>), four descriptor handles are automatically allocated and associated with the statement. Explicitly allocated descriptor handles can be associated with the statement by calling <B>SQLAllocHandle</B> with an <I>fHandleType</I> of SQL_HANDLE_DESC to allocate a descriptor handle and then calling <B>SQLSetStmtAttr</B> to associate the descriptor handle with the statement. </P>
+#
+# <P>The statement attributes in the following table correspond to descriptor header fields.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=42%>Statement attribute</TH>
+# <TH width=45%>Header field</TH>
+# <TH width=13%>Desc.</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=42%>SQL_ATTR_PARAM_BIND_OFFSET_PTR</TD>
+# <TD width=45%>SQL_DESC_BIND_OFFSET_PTR</TD>
+# <TD width=13%>APD</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=42%>SQL_ATTR_PARAM_BIND_TYPE</TD>
+# <TD width=45%>SQL_DESC_BIND_TYPE</TD>
+# <TD width=13%>APD</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=42%>SQL_ATTR_PARAM_OPERATION_PTR</TD>
+# <TD width=45%>SQL_DESC_ARRAY_STATUS_PTR</TD>
+# <TD width=13%>APD</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=42%>SQL_ATTR_PARAM_STATUS_PTR</TD>
+# <TD width=45%>SQL_DESC_ARRAY_STATUS_PTR</TD>
+# <TD width=13%>IPD</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=42%>SQL_ATTR_PARAMS_PROCESSED_PTR</TD>
+# <TD width=45%>SQL_DESC_ROWS_PROCESSED_PTR</TD>
+# <TD width=13%>IPD</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=42%>SQL_ATTR_PARAMSET_SIZE</TD>
+# <TD width=45%>SQL_DESC_ARRAY_SIZE</TD>
+# <TD width=13%>APD</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=42%>SQL_ATTR_ROW_ARRAY_SIZE</TD>
+# <TD width=45%>SQL_DESC_ARRAY_SIZE</TD>
+# <TD width=13%>ARD</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=42%>SQL_ATTR_ROW_BIND_OFFSET_PTR</TD>
+# <TD width=45%>SQL_DESC_BIND_OFFSET_PTR</TD>
+# <TD width=13%>ARD</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=42%>SQL_ATTR_ROW_BIND_TYPE</TD>
+# <TD width=45%>SQL_DESC_BIND_TYPE</TD>
+# <TD width=13%>ARD</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=42%>SQL_ATTR_ROW_OPERATION_PTR</TD>
+# <TD width=45%>SQL_DESC_ARRAY_STATUS_PTR</TD>
+# <TD width=13%>ARD</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=42%>SQL_ATTR_ROW_STATUS_PTR</TD>
+# <TD width=45%>SQL_DESC_ARRAY_STATUS_PTR</TD>
+# <TD width=13%>IRD</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=42%>SQL_ATTR_ROWS_FETCHED_PTR</TD>
+# <TD width=45%>SQL_DESC_ROWS_PROCESSED_PTR</TD>
+# <TD width=13%>IRD</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <H1>Statement Attributes</H1>
+#
+# <P>The currently defined attributes and the version of ODBC in which they were introduced are shown in the following table; it is expected that more attributes will be defined by drivers to take advantage of different data sources. A range of attributes is reserved by ODBC; driver developers must reserve values for their own driver-specific use from X/Open. For more information, see "<A HREF="odbcdriver_specific_data_types__descriptor_types__information_types.htm">Driver-Specific Data Types, Descriptor Types, Information Types, Diagnostic Types, and Attributes</A>" in Chapter 17: Programming Considerations.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=38%>Attribute</TH>
+# <TH width=62%><I>ValuePtr</I> contents</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_APP_PARAM_DESC<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>The handle to the APD for subsequent calls to <B>SQLExecute</B> and <B>SQLExecDirect</B> on the statement handle. The initial value of this attribute is the descriptor implicitly allocated when the statement was initially allocated. If the value of this attribute is set to SQL_NULL_DESC or the handle originally allocated for the descriptor, an explicitly allocated APD handle that was previously associated with the statement handle is dissociated from it and the statement handle reverts to the implicitly allocated APD handle.
+# <P>This attribute cannot be set to a descriptor handle that was implicitly allocated for another statement or to another descriptor handle that was implicitly set on the same statement; implicitly allocated descriptor handles cannot be associated with more than one statement or descriptor handle.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_APP_PARAM_DESC => {
+ type => q(SQLPOINTER),
+ ptr => undef,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_APP_ROW_DESC<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>The handle to the ARD for subsequent fetches on the statement handle. The initial value of this attribute is the descriptor implicitly allocated when the statement was initially allocated. If the value of this attribute is set to SQL_NULL_DESC or the handle originally allocated for the descriptor, an explicitly allocated ARD handle that was previously associated with the statement handle is dissociated from it and the statement handle reverts to the implicitly allocated ARD handle.
+# <P>This attribute cannot be set to a descriptor handle that was implicitly allocated for another statement or to another descriptor handle that was implicitly set on the same statement; implicitly allocated descriptor handles cannot be associated with more than one statement or descriptor handle.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_APP_ROW_DESC => {
+ type => q(SQLPOINTER),
+ ptr => undef,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_ASYNC_ENABLE<BR>
+# (ODBC 1.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that specifies whether a function called with the specified statement is executed asynchronously:
+# <P>SQL_ASYNC_ENABLE_OFF = Off (the default)<BR>
+# SQL_ASYNC_ENABLE_ON = On</P>
+#
+# <P>Once a function has been called asynchronously, only the original function, <B>SQLCancel</B>, <B>SQLGetDiagField</B>, or <B>SQLGetDiagRec</B> can be called on the statement, and only the original function, <B>SQLAllocHandle </B>(with a <I>HandleType</I> of SQL_HANDLE_STMT), <B>SQLGetDiagField</B>, <B>SQLGetDiagRec</B>, or <B>SQLGetFunctions</B> can be called on the connection associated with the statement, until the original function returns a code other than SQL_STILL_EXECUTING. Any other function called on the statement or the connection associated with the statement returns SQL_ERROR with an SQLSTATE of HY010 (Function sequence error). Functions can be called on other statements. For more information, see "<A HREF="odbcasynchronous_execution.htm">Asynchronous Execution</A>" in Chapter 9: Executing Statements.</P>
+#
+# <P>For drivers with statement level asynchronous execution support, the statement attribute SQL_ATTR_ASYNC_ENABLE may be set. Its initial value is the same as the value of the connection level attribute with the same name at the time the statement handle was allocated. </P>
+#
+# <P>For drivers with connection-level, asynchronous-execution support, the statement attribute SQL_ATTR_ASYNC_ENABLE is read-only. Its value is the same as the value of the connection level attribute with the same name at the time the statement handle was allocated. Calling <B>SQLSetStmtAttr</B> to set SQL_ATTR_ASYNC_ENABLE when the SQL_ASYNC_MODE <I>InfoType</I> returns SQL_AM_CONNECTION returns SQLSTATE HYC00 (Optional feature not implemented). (See <B>SQLSetConnectAttr</B> for more information.)</P>
+#
+# <P>As a standard practice, applications should execute functions asynchronously only on single-thread operating systems. On multithread operating systems, applications should execute functions on separate threads rather than executing them asynchronously on the same thread. No functionality is lost if drivers that operate only on multithread operating systems do not need to support asynchronous execution. </P>
+#
+# <P>The following functions can be executed asynchronously:</P>
+#
+# <P><B>SQLBulkOperations<BR>
+# SQLColAttribute</B><BR>
+# <B>SQLColumnPrivileges</B><BR>
+# <B>SQLColumns</B><BR>
+# <B>SQLCopyDesc</B><BR>
+# <B>SQLDescribeCol</B><BR>
+# <B>SQLDescribeParam</B><BR>
+# <B>SQLExecDirect</B><BR>
+# <B>SQLExecute</B><BR>
+# <B>SQLFetch</B><BR>
+# <B>SQLFetchScroll</B><BR>
+# <B>SQLForeignKeys</B><BR>
+# <B>SQLGetData</B><BR>
+# <B>SQLGetDescField</B><SUP>[1]</SUP><BR>
+# <B>SQLGetDescRec</B><SUP>[1]</SUP><B><BR>
+# SQLGetDiagField</B><BR>
+# <B>SQLGetDiagRec<BR>
+# SQLGetTypeInfo</B><BR>
+# <B>SQLMoreResults</B><BR>
+# <B>SQLNumParams</B><BR>
+# <B>SQLNumResultCols</B><BR>
+# <B>SQLParamData</B><BR>
+# <B>SQLPrepare</B><BR>
+# <B>SQLPrimaryKeys</B><BR>
+# <B>SQLProcedureColumns</B><BR>
+# <B>SQLProcedures</B><BR>
+# <B>SQLPutData</B><BR>
+# <B>SQLSetPos</B><BR>
+# <B>SQLSpecialColumns</B><BR>
+# <B>SQLStatistics</B><BR>
+# <B>SQLTablePrivileges</B><BR>
+# <B>SQLTables</B></P>
+# </TD>
+# </TR>
+ SQL_ATTR_ASYNC_ENABLE => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_CONCURRENCY<BR>
+# (ODBC 2.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that specifies the cursor concurrency:
+# <P>SQL_CONCUR_READ_ONLY = Cursor is read-only. No updates are allowed.</P>
+#
+# <P>SQL_CONCUR_LOCK = Cursor uses the lowest level of locking sufficient to ensure that the row can be updated.</P>
+#
+# <P>SQL_CONCUR_ROWVER = Cursor uses optimistic concurrency control, comparing row versions such as SQLBase ROWID or Sybase TIMESTAMP.</P>
+#
+# <P>SQL_CONCUR_VALUES = Cursor uses optimistic concurrency control, comparing values.</P>
+#
+# <P>The default value for SQL_ATTR_CONCURRENCY is SQL_CONCUR_READ_ONLY.</P>
+#
+# <P>This attribute cannot be specified for an open cursor. For more information, see "<A HREF="odbcconcurrency_types.htm">Concurrency Types</A>" in Chapter 14: Transactions.</P>
+#
+# <P>If the SQL_ATTR_CURSOR_TYPE <I>Attribute</I> is changed to a type that does not support the current value of SQL_ATTR_CONCURRENCY, the value of SQL_ATTR_CONCURRENCY will be changed at execution time, and a warning issued when <B>SQLExecDirect</B> or <B>SQLPrepare</B> is called.</P>
+#
+# <P>If the driver supports the <B>SELECT FOR UPDATE</B> statement and such a statement is executed while the value of SQL_ATTR_CONCURRENCY is set to SQL_CONCUR_READ_ONLY, an error will be returned. If the value of SQL_ATTR_CONCURRENCY is changed to a value that the driver supports for some value of SQL_ATTR_CURSOR_TYPE but not for the current value of SQL_ATTR_CURSOR_TYPE, the value of SQL_ATTR_CURSOR_TYPE will be changed at execution time and SQLSTATE 01S02 (Option value changed) is issued when <B>SQLExecDirect</B> or <B>SQLPrepare</B> is called.</P>
+#
+# <P>If the specified concurrency is not supported by the data source, the driver substitutes a different concurrency and returns SQLSTATE 01S02 (Option value changed). For SQL_CONCUR_VALUES, the driver substitutes SQL_CONCUR_ROWVER, and vice versa. For SQL_CONCUR_LOCK, the driver substitutes, in order, SQL_CONCUR_ROWVER or SQL_CONCUR_VALUES. The validity of the substituted value is not checked until execution time.</P>
+#
+# <P>For more information about the relationship between SQL_ATTR_CONCURRENCY and the other cursor attributes, see "<A HREF="odbccursor_characteristics_and_cursor_type.htm">Cursor Characteristics and Cursor Type</A>" in Chapter 11: Retrieving Results (Advanced).</P>
+# </TD>
+# </TR>
+ SQL_ATTR_CONCURRENCY => {
+ type => q(SQLUINTEGER),
+ ptr => undef,
+ value => [ qw(SQL_CONCUR_READ_ONLY SQL_CONCUR_LOCK SQL_CONCUR_ROWVER SQL_CONCUR_ROWVER) ],
+ default => q(SQL_CONCUR_READ_ONLY),
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_CURSOR_SCROLLABLE<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that specifies the level of support that the application requires. Setting this attribute affects subsequent calls to <B>SQLExecDirect</B> and <B>SQLExecute</B>.
+# <P>SQL_NONSCROLLABLE = Scrollable cursors are not required on the statement handle. If the application calls <B>SQLFetchScroll</B> on this handle, the only valid value of <I>FetchOrientation</I> is SQL_FETCH_NEXT. This is the default.</P>
+#
+# <P>SQL_SCROLLABLE = Scrollable cursors are required on the statement handle. When calling <B>SQLFetchScroll</B>, the application may specify any valid value of <I>FetchOrientation</I>, achieving cursor positioning in modes other than the sequential mode. </P>
+#
+# <P>For more information about scrollable cursors, see "<A HREF="odbcscrollable_cursors.htm">Scrollable Cursors</A>" in Chapter 11: Retrieving Results (Advanced). For more information about the relationship between SQL_ATTR_CURSOR_SCROLLABLE and the other cursor attributes, see "<A HREF="odbccursor_characteristics_and_cursor_type.htm">Cursor Characteristics and Cursor Type</A>" in Chapter 11: Retrieving Results (Advanced).</P>
+# </TD>
+# </TR>
+ SQL_ATTR_CURSOR_SCROLLABLE => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_NONSCROLLABLE SQL_SCROLLABLE) ],
+ default => q(SQL_NONSCROLLABLE),
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_CURSOR_SENSITIVITY<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that specifies whether cursors on the statement handle make visible the changes made to a result set by another cursor. Setting this attribute affects subsequent calls to <B>SQLExecDirect</B> and <B>SQLExecute</B>. An application can read back the value of this attribute to obtain its initial state or its state as most recently set by the application.
+# <P>SQL_UNSPECIFIED = It is unspecified what the cursor type is and whether cursors on the statement handle make visible the changes made to a result set by another cursor. Cursors on the statement handle may make visible none, some, or all such changes. This is the default.</P>
+#
+# <P>SQL_INSENSITIVE = All cursors on the statement handle show the result set without reflecting any changes made to it by any other cursor. Insensitive cursors are read-only. This corresponds to a static cursor, which has a concurrency that is read-only.</P>
+#
+# <P>SQL_SENSITIVE = All cursors on the statement handle make visible all changes made to a result set by another cursor. </P>
+#
+# <P>For more information about the relationship between SQL_ATTR_CURSOR_SENSITIVITY and the other cursor attributes, see "<A HREF="odbccursor_characteristics_and_cursor_type.htm">Cursor Characteristics and Cursor Type</A>" in Chapter 11: Retrieving Results (Advanced).</P>
+# </TD>
+# </TR>
+ SQL_ATTR_CURSOR_SENSITIVITY => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_UNSPECIFIED SQL_INSENSITIVE SQL_SENSITIVE) ],
+ default => q(SQL_UNSPECIFIED),
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_CURSOR_TYPE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that specifies the cursor type:
+# <P>SQL_CURSOR_FORWARD_ONLY = The cursor only scrolls forward.</P>
+#
+# <P>SQL_CURSOR_STATIC = The data in the result set is static.</P>
+#
+# <P>SQL_CURSOR_KEYSET_DRIVEN = The driver saves and uses the keys for the number of rows specified in the SQL_ATTR_KEYSET_SIZE statement attribute.</P>
+#
+# <P>SQL_CURSOR_DYNAMIC = The driver saves and uses only the keys for the rows in the rowset.</P>
+#
+# <P>The default value is SQL_CURSOR_FORWARD_ONLY. This attribute cannot be specified after the SQL statement has been prepared.</P>
+#
+# <P>If the specified cursor type is not supported by the data source, the driver substitutes a different cursor type and returns SQLSTATE 01S02 (Option value changed). For a mixed or dynamic cursor, the driver substitutes, in order, a keyset-driven or static cursor. For a keyset-driven cursor, the driver substitutes a static cursor. </P>
+#
+# <P>For more information about scrollable cursor types, see "<A HREF="odbcscrollable_cursor_types.htm">Scrollable Cursor Types</A>" in Chapter 11: Retrieving Results (Advanced). For more information about the relationship between SQL_ATTR_CURSOR_TYPE and the other cursor attributes, see "<A HREF="odbccursor_characteristics_and_cursor_type.htm">Cursor Characteristics and Cursor Type</A>" in Chapter 11: Retrieving Results (Advanced).</P>
+# </TD>
+# </TR>
+ SQL_ATTR_CURSOR_TYPE => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_CURSOR_FORWARD_ONLY SQL_CURSOR_STATIC SQL_CURSOR_KEYSET_DRIVEN SQL_CURSOR_DYNAMIC) ],
+ default => q(SQL_CURSOR_FORWARD_ONLY),
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_ENABLE_AUTO_IPD<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that specifies whether automatic population of the IPD is performed:
+# <P>SQL_TRUE = Turns on automatic population of the IPD after a call to <B>SQLPrepare</B>. SQL_FALSE = Turns off automatic population of the IPD after a call to <B>SQLPrepare</B>. (An application can still obtain IPD field information by calling <B>SQLDescribeParam</B>, if supported.) The default value of the statement attribute SQL_ATTR_ENABLE_AUTO_IPD is SQL_FALSE. For more information, see "<A HREF="odbcautomatic_population_of_the_ipd.htm">Automatic Population of the IPD</A>" in Chapter 13: Descriptors.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_ENABLE_AUTO_IPD => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_FALSE SQL_TRUE) ],
+ default => q(SQL_FALSE),
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_FETCH_BOOKMARK_PTR<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>A pointer that points to a binary bookmark value. When <B>SQLFetchScroll</B> is called with <I>fFetchOrientation</I> equal to SQL_FETCH_BOOKMARK, the driver picks up the bookmark value from this field. This field defaults to a null pointer. For more information, see "<A HREF="odbcscrolling_by_bookmark.htm">Scrolling by Bookmark</A>" in Chapter 11: Retrieving Results (Advanced).
+# <P>The value pointed to by this field is not used for delete by bookmark, update by bookmark, or fetch by bookmark operations in <B>SQLBulkOperations</B>, which use bookmarks cached in rowset buffers.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_FETCH_BOOKMARK_PTR => {
+ type => q(SQLPOINTER),
+ ptr => undef,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_IMP_PARAM_DESC<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>The handle to the IPD. The value of this attribute is the descriptor allocated when the statement was initially allocated. The application cannot set this attribute.
+# <P>This attribute can be retrieved by a call to <B>SQLGetStmtAttr</B> but not set by a call to <B>SQLSetStmtAttr</B>.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_IMP_PARAM_DESC => {
+ type => q(SQLPOINTER),
+ ptr => undef,
+ value => undef,
+ default => undef,
+ mode => 'ro',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_IMP_ROW_DESC<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>The handle to the IRD. The value of this attribute is the descriptor allocated when the statement was initially allocated. The application cannot set this attribute.
+# <P>This attribute can be retrieved by a call to <B>SQLGetStmtAttr</B> but not set by a call to <B>SQLSetStmtAttr</B>.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_IMP_ROW_DESC => {
+ type => q(SQLPOINTER),
+ ptr => undef,
+ value => undef,
+ default => undef,
+ mode => 'ro',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_KEYSET_SIZE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=62%>An SQLUINTEGER that specifies the number of rows in the keyset for a keyset-driven cursor. If the keyset size is 0 (the default), the cursor is fully keyset-driven. If the keyset size is greater than 0, the cursor is mixed (keyset-driven within the keyset and dynamic outside of the keyset). The default keyset size is 0. For more information about keyset-driven cursors, see "<A HREF="odbckeyset_driven_cursors.htm">Keyset-Driven Cursors</A>" in Chapter 11: Retrieving Results (Advanced).
+# <P>If the specified size exceeds the maximum keyset size, the driver substitutes that size and returns SQLSTATE 01S02 (Option value changed).</P>
+#
+# <P><B>SQLFetch</B> or <B>SQLFetchScroll</B> returns an error if the keyset size is greater than 0 and less than the rowset size.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_KEYSET_SIZE => {
+ type => q(SQLUINTEGER),
+ ptr => undef,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_MAX_LENGTH<BR>
+# (ODBC 1.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that specifies the maximum amount of data that the driver returns from a character or binary column. If <I>ValuePtr</I> is less than the length of the available data, <B>SQLFetch</B> or <B>SQLGetData</B> truncates the data and returns SQL_SUCCESS. If <I>ValuePtr</I> is 0 (the default), the driver attempts to return all available data.
+# <P>If the specified length is less than the minimum amount of data that the data source can return or greater than the maximum amount of data that the data source can return, the driver substitutes that value and returns SQLSTATE 01S02 (Option value changed).</P>
+#
+# <P>The value of this attribute can be set on an open cursor; however, the setting might not take effect immediately, in which case the driver will return SQLSTATE 01S02 (Option value changed) and reset the attribute to its original value.</P>
+#
+# <P>This attribute is intended to reduce network traffic and should be supported only when the data source (as opposed to the driver) in a multiple-tier driver can implement it. This mechanism should not be used by applications to truncate data; to truncate data received, an application should specify the maximum buffer length in the <I>BufferLength </I>argument in <B>SQLBindCol</B> or <B>SQLGetData</B>.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_MAX_LENGTH => {
+ type => q(SQLUINTEGER),
+ ptr => undef,
+ value => undef,
+ default => 0,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_MAX_ROWS<BR>
+# (ODBC 1.0)</TD>
+# <TD width=62%>An SQLUINTEGER value corresponding to the maximum number of rows to return to the application for a <B>SELECT</B> statement. If *<I>ValuePtr</I> equals 0 (the default), the driver returns all rows.
+# <P>This attribute is intended to reduce network traffic. Conceptually, it is applied when the result set is created and limits the result set to the first <I>ValuePtr</I> rows. If the number of rows in the result set is greater than <I>ValuePtr</I>, the result set is truncated. </P>
+#
+# <P>SQL_ATTR_MAX_ROWS applies to all result sets on the <I>Statement</I>, including those returned by catalog functions. SQL_ATTR_MAX_ROWS establishes a maximum for the value of the cursor row count.</P>
+#
+# <P>A driver should not emulate SQL_ATTR_MAX_ROWS behavior for <B>SQLFetch</B> or <B>SQLFetchScroll</B> (if result set size limitations cannot be implemented at the data source) if it cannot guarantee that SQL_ATTR_MAX_ROWS will be implemented properly.</P>
+#
+# <P>It is driver-defined whether SQL_ATTR_MAX_ROWS applies to statements other than SELECT statements (such as catalog functions). </P>
+#
+# <P>The value of this attribute can be set on an open cursor; however, the setting might not take effect immediately, in which case the driver will return SQLSTATE 01S02 (Option value changed) and reset the attribute to its original value.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_MAX_ROWS => {
+ type => q(SQLUINTEGER),
+ ptr => undef,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_METADATA_ID<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that determines how the string arguments of catalog functions are treated.
+# <P>If SQL_TRUE, the string argument of catalog functions are treated as identifiers. The case is not significant. For nondelimited strings, the driver removes any trailing spaces and the string is folded to uppercase. For delimited strings, the driver removes any leading or trailing spaces and takes whatever is between the delimiters literally. If one of these arguments is set to a null pointer, the function returns SQL_ERROR and SQLSTATE HY009 (Invalid use of null pointer). </P>
+#
+# <P>If SQL_FALSE, the string arguments of catalog functions are not treated as identifiers. The case is significant. They can either contain a string search pattern or not, depending on the argument.</P>
+#
+# <P>The default value is SQL_FALSE.</P>
+#
+# <P>The <I>TableType</I> argument of <B>SQLTables</B>, which takes a list of values, is not affected by this attribute.</P>
+#
+# <P>SQL_ATTR_METADATA_ID can also be set on the connection level. (It and SQL_ATTR_ASYNC_ENABLE are the only statement attributes that are also connection attributes.)</P>
+#
+# <P>For more information, see "<A HREF="odbcarguments_in_catalog_functions.htm">Arguments in Catalog Functions</A>" in Chapter 7: Catalog Functions.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_METADATA_ID => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_FALSE SQL_TRUE) ],
+ default => q(SQL_FALSE),
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_NOSCAN<BR>
+# (ODBC 1.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that indicates whether the driver should scan SQL strings for escape sequences:
+# <P>SQL_NOSCAN_OFF = The driver scans SQL strings for escape sequences (the default).</P>
+#
+# <P>SQL_NOSCAN_ON = The driver does not scan SQL strings for escape sequences. Instead, the driver sends the statement directly to the data source.</P>
+#
+# <P>For more information, see "<A HREF="odbcescape_sequences_in_odbc.htm">Escape Sequences in ODBC</A>" in Chapter 8: SQL Statements.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_NOSCAN => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_NOSCAN_OFF SQL_NOSCAN_ON) ],
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_PARAM_BIND_OFFSET_PTR<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>An SQLUINTEGER * value that points to an offset added to pointers to change binding of dynamic parameters. If this field is non-null, the driver dereferences the pointer, adds the dereferenced value to each of the deferred fields in the descriptor record (SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR, and SQL_DESC_OCTET_LENGTH_PTR), and uses the new pointer values when binding. It is set to null by default.
+# <P>The bind offset is always added directly to the SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR, and SQL_DESC_OCTET_LENGTH_PTR fields. If the offset is changed to a different value, the new value is still added directly to the value in the descriptor field. The new offset is not added to the field value plus any earlier offsets.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_PARAM_BIND_OFFSET_PTR => {
+ type => q(SQLUINTEGER),
+ ptr => 1,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_PARAM_BIND_OFFSET_PTR<BR>
+# (ODBC 3.0) (<I>continued</I>)</TD>
+# <TD width=62%>For more information, see "<A HREF="odbcparameter_binding_offsets.htm">Parameter Binding Offsets</A>" in Chapter 9: Executing Statements.
+# <P>Setting this statement attribute sets the SQL_DESC_BIND_OFFSET_PTR field in the APD header.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_PARAM_BIND_TYPE<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that indicates the binding orientation to be used for dynamic parameters.
+# <P>This field is set to SQL_PARAM_BIND_BY_COLUMN (the default) to select column-wise binding. </P>
+#
+# <P>To select row-wise binding, this field is set to the length of the structure or an instance of a buffer that will be bound to a set of dynamic parameters. This length must include space for all of the bound parameters and any padding of the structure or buffer to ensure that when the address of a bound parameter is incremented with the specified length, the result will point to the beginning of the same parameter in the next set of parameters. When using the <I>sizeof</I> operator in ANSI C, this behavior is guaranteed.</P>
+#
+# <P>For more information, see "<A HREF="odbcbinding_arrays_of_parameters.htm">Binding Arrays of Parameters</A>" in Chapter 9: Executing Statements.</P>
+#
+# <P>Setting this statement attribute sets the SQL_DESC_ BIND_TYPE field in the APD header.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_PARAM_BIND_TYPE => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_PARAM_OPERATION_PTR<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>An SQLUSMALLINT * value that points to an array of SQLUSMALLINT values used to ignore a parameter during execution of an SQL statement. Each value is set to either SQL_PARAM_PROCEED (for the parameter to be executed) or SQL_PARAM_IGNORE (for the parameter to be ignored).
+# <P>A set of parameters can be ignored during processing by setting the status value in the array pointed to by SQL_DESC_ARRAY_STATUS_PTR in the APD to SQL_PARAM_IGNORE. A set of parameters is processed if its status value is set to SQL_PARAM_PROCEED or if no elements in the array are set.</P>
+#
+# <P>This statement attribute can be set to a null pointer, in which case the driver does not return parameter status values. This attribute can be set at any time, but the new value is not used until the next time <B>SQLExecDirect</B> or <B>SQLExecute</B> is called.</P>
+#
+# <P>For more information, see "<A HREF="odbcusing_arrays_of_parameters.htm">Using Arrays of Parameters</A>" in Chapter 9: Executing Statements.</P>
+#
+# <P>Setting this statement attribute sets the SQL_DESC_ARRAY_STATUS_PTR field in the APD header.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_PARAM_OPERATION_PTR => {
+ type => q(SQLUSMALLINT),
+ ptr => 1,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_PARAM_STATUS_PTR<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>An SQLUSMALLINT * value that points to an array of SQLUSMALLINT values containing status information for each row of parameter values after a call to <B>SQLExecute</B> or <B>SQLExecDirect</B>. This field is required only if PARAMSET_SIZE is greater than 1.
+# <P>The status values can contain the following values:</P>
+#
+# <P>SQL_PARAM_SUCCESS: The SQL statement was successfully executed for this set of parameters.</P>
+#
+# <P>SQL_PARAM_SUCCESS_WITH_INFO: The SQL statement was successfully executed for this set of parameters; however, warning information is available in the diagnostics data structure.</P>
+#
+# <P>SQL_PARAM_ERROR: There was an error in processing this set of parameters. Additional error information is available in the diagnostics data structure.</P>
+#
+# <P>SQL_PARAM_UNUSED: This parameter set was unused, possibly due to the fact that some previous parameter set caused an error that aborted further processing, or because SQL_PARAM_IGNORE was set for that set of parameters in the array specified by the SQL_ATTR_PARAM_OPERATION_PTR.</P>
+#
+# <P>SQL_PARAM_DIAG_UNAVAILABLE: The driver treats arrays of parameters as a monolithic unit and so does not generate this level of error information. </P>
+#
+# <P>This statement attribute can be set to a null pointer, in which case the driver does not return parameter status values. This attribute can be set at any time, but the new value is not used until the next time <B>SQLExecute</B> or <B>SQLExecDirect</B> is called. Note that setting this attribute can affect the output parameter behavior implemented by the driver.</P>
+#
+# <P>For more information, see "<A HREF="odbcusing_arrays_of_parameters.htm">Using Arrays of Parameters</A>" in Chapter 9: Executing Statements.</P>
+#
+# <P>Setting this statement attribute sets the SQL_DESC_ARRAY_STATUS_PTR field in the IPD header.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_PARAM_STATUS_PTR => {
+ type => q(SQLUSMALLINT),
+ ptr => 1,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_PARAMS_PROCESSED_PTR<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>An SQLUINTEGER * record field that points to a buffer in which to return the number of sets of parameters that have been processed, including error sets. No number will be returned if this is a null pointer.
+# <P>Setting this statement attribute sets the SQL_DESC_ROWS_PROCESSED_PTR field in the IPD header.</P>
+#
+# <P>If the call to <B>SQLExecDirect</B> or <B>SQLExecute</B> that fills in the buffer pointed to by this attribute does not return SQL_SUCCESS or SQL_SUCCESS_WITH_INFO, the contents of the buffer are undefined.</P>
+#
+# <P>For more information, see "<A HREF="odbcusing_arrays_of_parameters.htm">Using Arrays of Parameters</A>" in Chapter 9: Executing Statements.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_PARAMS_PROCESSED_PTR => {
+ type => q(SQLUINTEGER),
+ ptr => 1,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_PARAMSET_SIZE<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that specifies the number of values for each parameter. If SQL_ATTR_PARAMSET_SIZE is greater than 1, SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR, and SQL_DESC_OCTET_LENGTH_PTR of the APD point to arrays. The cardinality of each array is equal to the value of this field.
+# <P>For more information, see "<A HREF="odbcusing_arrays_of_parameters.htm">Using Arrays of Parameters</A>" in Chapter 9: Executing Statements.</P>
+#
+# <P>Setting this statement attribute sets the SQL_DESC_ARRAY_SIZE field in the APD header.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_PARAMSET_SIZE => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_QUERY_TIMEOUT<BR>
+# (ODBC 1.0)</TD>
+# <TD width=62%>An SQLUINTEGER value corresponding to the number of seconds to wait for an SQL statement to execute before returning to the application. If <I>ValuePtr</I> is equal to 0 (default), there is no timeout.
+# <P>If the specified timeout exceeds the maximum timeout in the data source or is smaller than the minimum timeout, <B>SQLSetStmtAttr</B> substitutes that value and returns SQLSTATE 01S02 (Option value changed).</P>
+#
+# <P>Note that the application need not call <B>SQLCloseCursor</B> to reuse the statement if a <B>SELECT</B> statement timed out.</P>
+#
+# <P>The query timeout set in this statement attribute is valid in both synchronous and asynchronous modes.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_QUERY_TIMEOUT => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_RETRIEVE_DATA<BR>
+# (ODBC 2.0)</TD>
+# <TD width=62%>An SQLUINTEGER value:
+# <P>SQL_RD_ON = <B>SQLFetchScroll</B> and, in ODBC 3<I>.x</I>, <B>SQLFetch</B> retrieve data after it positions the cursor to the specified location. This is the default.</P>
+#
+# <P>SQL_RD_OFF = <B>SQLFetchScroll</B> and, in ODBC 3<I>.x</I>, <B>SQLFetch</B> do not retrieve data after it positions the cursor.</P>
+#
+# <P>By setting SQL_RETRIEVE_DATA to SQL_RD_OFF, an application can verify that a row exists or retrieve a bookmark for the row without incurring the overhead of retrieving rows. For more information, see "<A HREF="odbcscrolling_and_fetching_rows.htm">Scrolling and Fetching Rows</A>" in Chapter 11: Retrieving Results (Advanced).</P>
+#
+# <P>The value of this attribute can be set on an open cursor; however, the setting might not take effect immediately, in which case the driver will return SQLSTATE 01S02 (Option value changed) and reset the attribute to its original value.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_RETRIEVE_DATA => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_RD_ON SQL_RD_OFF) ],
+ default => q(SQL_RD_ON),
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_ROW_ARRAY_SIZE<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that specifies the number of rows returned by each call to <B>SQLFetch</B> or <B>SQLFetchScroll</B>. It is also the number of rows in a bookmark array used in a bulk bookmark operation in <B>SQLBulkOperations</B>. The default value is 1.
+# <P>If the specified rowset size exceeds the maximum rowset size supported by the data source, the driver substitutes that value and returns SQLSTATE 01S02 (Option value changed).</P>
+#
+# <P>For more information, see "<A HREF="odbcrowset_size.htm">Rowset Size</A>" in Chapter 11: Retrieving Results (Advanced).</P>
+#
+# <P>Setting this statement attribute sets the SQL_DESC_ARRAY_SIZE field in the ARD header.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_ROW_ARRAY_SIZE => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_ROW_BIND_OFFSET_PTR<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>An SQLUINTEGER * value that points to an offset added to pointers to change binding of column data. If this field is non-null, the driver dereferences the pointer, adds the dereferenced value to each of the deferred fields in the descriptor record (SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR, and SQL_DESC_OCTET_LENGTH_PTR), and uses the new pointer values when binding. It is set to null by default.
+# <P>Setting this statement attribute sets the SQL_DESC_BIND_OFFSET_PTR field in the ARD header.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_ROW_BIND_OFFSET_PTR => {
+ type => q(SQLUINTEGER),
+ ptr => undef,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_ROW_BIND_TYPE<BR>
+# (ODBC 1.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that sets the binding orientation to be used when <B>SQLFetch</B> or <B>SQLFetchScroll</B> is called on the associated statement. Column-wise binding is selected by setting the value to SQL_BIND_BY_COLUMN. Row-wise binding is selected by setting the value to the length of a structure or an instance of a buffer into which result columns will be bound.
+# <P>If a length is specified, it must include space for all of the bound columns and any padding of the structure or buffer to ensure that when the address of a bound column is incremented with the specified length, the result will point to the beginning of the same column in the next row. When using the <B>sizeof</B> operator with structures or unions in ANSI C, this behavior is guaranteed.</P>
+#
+# <P>Column-wise binding is the default binding orientation for <B>SQLFetch</B> and <B>SQLFetchScroll</B>.</P>
+#
+# <P>For more information, see "<A HREF="odbcbinding_columns_for_use_with_block_cursors.htm">Binding Columns for Use with Block Cursors</A>" in Chapter 11: Retrieving Results (Advanced).</P>
+#
+# <P>Setting this statement attribute sets the SQL_DESC_BIND_TYPE field in the ARD header.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_ROW_BIND_TYPE => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_BIND_BY_COLUMN etc) ],
+ default => q(SQL_BIND_BY_COLUMN),
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_ROW_NUMBER<BR>
+# (ODBC 2.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that is the number of the current row in the entire result set. If the number of the current row cannot be determined or there is no current row, the driver returns 0.
+# <P>This attribute can be retrieved by a call to <B>SQLGetStmtAttr</B> but not set by a call to <B>SQLSetStmtAttr</B>.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_ROW_NUMBER => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_ROW_OPERATION_PTR<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>An SQLUSMALLINT * value that points to an array of SQLUSMALLINT values used to ignore a row during a bulk operation using <B>SQLSetPos</B>. Each value is set to either SQL_ROW_PROCEED (for the row to be included in the bulk operation) or SQL_ROW_IGNORE (for the row to be excluded from the bulk operation). (Rows cannot be ignored by using this array during calls to <B>SQLBulkOperations</B>.)
+# <P>This statement attribute can be set to a null pointer, in which case the driver does not return row status values. This attribute can be set at any time, but the new value is not used until the next time <B>SQLSetPos</B> is called.</P>
+#
+# <P>For more information, see "<A HREF="odbcupdating_rows_in_the_rowset_with_sqlsetpos.htm">Updating Rows in the Rowset with SQLSetPos</A>" and "<A HREF="odbcdeleting_rows_in_the_rowset_with_sqlsetpos.htm">Deleting Rows in the Rowset with SQLSetPos</A>" in Chapter 12: Updating Data.</P>
+#
+# <P>Setting this statement attribute sets the SQL_DESC_ARRAY_STATUS_PTR field in the ARD.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_ROW_OPERATION_PTR => {
+ type => q(SQLUSMALLINT),
+ ptr => 1,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_ROW_STATUS_PTR<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>An SQLUSMALLINT * value that points to an array of SQLUSMALLINT values containing row status values after a call to <B>SQLFetch</B> or <B>SQLFetchScroll</B>. The array has as many elements as there are rows in the rowset.
+# <P>This statement attribute can be set to a null pointer, in which case the driver does not return row status values. This attribute can be set at any time, but the new value is not used until the next time <B>SQLBulkOperations</B>, <B>SQLFetch</B>, <B>SQLFetchScroll</B>, or <B>SQLSetPos</B> is called.</P>
+#
+# <P>For more information, see "<A HREF="odbcnumber_of_rows_fetched_and_status.htm">Number of Rows Fetched and Status</A>" in Chapter 11: Retrieving Results (Advanced).</P>
+#
+# <P>Setting this statement attribute sets the SQL_DESC_ARRAY_STATUS_PTR field in the IRD header.</P>
+#
+# <P>This attribute is mapped by an ODBC 2<I>.x</I> driver to the <I>rgbRowStatus</I> array in a call to <B>SQLExtendedFetch</B>.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_ROW_STATUS_PTR => {
+ type => q(SQLUSMALLINT),
+ ptr => 1,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_ROWS_FETCHED_PTR<BR>
+# (ODBC 3.0)</TD>
+# <TD width=62%>An SQLUINTEGER * value that points to a buffer in which to return the number of rows fetched after a call to <B>SQLFetch</B> or <B>SQLFetchScroll</B>; the number of rows affected by a bulk operation performed by a call to <B>SQLSetPos</B> with an <I>Operation</I> argument of SQL_REFRESH; or the number of rows affected by a bulk operation performed by <B>SQLBulkOperations</B>. This number includes error rows.
+# <P>For more information, see "<A HREF="odbcnumber_of_rows_fetched_and_status.htm">Number of Rows Fetched and Status</A>" in Chapter 11: Retrieving Results (Advanced).</P>
+#
+# <P>Setting this statement attribute sets the SQL_DESC_ROWS_PROCESSED_PTR field in the IRD header. </P>
+#
+# <P>If the call to <B>SQLFetch</B> or <B>SQLFetchScroll</B> that fills in the buffer pointed to by this attribute does not return SQL_SUCCESS or SQL_SUCCESS_WITH_INFO, the contents of the buffer are undefined.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_ROWS_FETCHED_PTR => {
+ type => q(SQLUINTEGER),
+ ptr => 1,
+ value => undef,
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_SIMULATE_CURSOR<BR>
+# (ODBC 2.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that specifies whether drivers that simulate positioned update and delete statements guarantee that such statements affect only one single row.
+# <P>To simulate positioned update and delete statements, most drivers construct a searched <B>UPDATE</B> or <B>DELETE</B> statement containing a <B>WHERE</B> clause that specifies the value of each column in the current row. Unless these columns make up a unique key, such a statement can affect more than one row.</P>
+#
+# <P>To guarantee that such statements affect only one row, the driver determines the columns in a unique key and adds these columns to the result set. If an application guarantees that the columns in the result set make up a unique key, the driver is not required to do so. This may reduce execution time.</P>
+#
+# <P>SQL_SC_NON_UNIQUE = The driver does not guarantee that simulated positioned update or delete statements will affect only one row; it is the application's responsibility to do so. If a statement affects more than one row, <B>SQLExecute</B>, <B>SQLExecDirect</B>, or <B>SQLSetPos</B> returns SQLSTATE 01001 (Cursor operation conflict).</P>
+#
+# <P>SQL_SC_TRY_UNIQUE = The driver attempts to guarantee that simulated positioned update or delete statements affect only one row. The driver always executes such statements, even if they might affect more than one row, such as when there is no unique key. If a statement affects more than one row, <B>SQLExecute</B>, <B>SQLExecDirect</B>, or <B>SQLSetPos</B> returns SQLSTATE 01001 (Cursor operation conflict).</P>
+#
+# <P>SQL_SC_UNIQUE = The driver guarantees that simulated positioned update or delete statements affect only one row. If the driver cannot guarantee this for a given statement, <B>SQLExecDirect</B> or <B>SQLPrepare</B> returns an error.</P>
+#
+# <P>If the data source provides native SQL support for positioned update and delete statements and the driver does not simulate cursors, SQL_SUCCESS is returned when SQL_SC_UNIQUE is requested for SQL_SIMULATE_CURSOR. SQL_SUCCESS_WITH_INFO is returned if SQL_SC_TRY_UNIQUE or SQL_SC_NON_UNIQUE is requested. If the data source provides the SQL_SC_TRY_UNIQUE level of support and the driver does not, SQL_SUCCESS is returned for SQL_SC_TRY_UNIQUE and SQL_SUCCESS_WITH_INFO is returned for SQL_SC_NON_UNIQUE.</P>
+#
+# <P>If the specified cursor simulation type is not supported by the data source, the driver substitutes a different simulation type and returns SQLSTATE 01S02 (Option value changed). For SQL_SC_UNIQUE, the driver substitutes, in order, SQL_SC_TRY_UNIQUE or SQL_SC_NON_UNIQUE. For SQL_SC_TRY_UNIQUE, the driver substitutes SQL_SC_NON_UNIQUE.</P>
+#
+# <P>For more information, see "<A HREF="odbcsimulating_positioned_update_and_delete_statements.htm">Simulating Positioned Update and Delete Statements</A>" in Chapter 12: Updating Data.</P>
+# </TD>
+# </TR>
+ SQL_ATTR_SIMULATE_CURSOR => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_SC_NON_UNIQUE SQL_SC_TRY_UNIQUE SQL_SC_UNIQUE) ],
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=38%>SQL_ATTR_USE_BOOKMARKS<BR>
+# (ODBC 2.0)</TD>
+# <TD width=62%>An SQLUINTEGER value that specifies whether an application will use bookmarks with a cursor:
+# <P>SQL_UB_OFF = Off (the default)</P>
+#
+# <P>SQL_UB_VARIABLE = An application will use bookmarks with a cursor, and the driver will provide variable-length bookmarks if they are supported. SQL_UB_FIXED is deprecated in ODBC 3<I>.x</I>. ODBC 3<I>.x</I> applications should always use variable-length bookmarks, even when working with ODBC 2<I>.x</I> drivers (which supported only 4-byte, fixed-length bookmarks). This is because a fixed-length bookmark is just a special case of a variable-length bookmark. When working with an ODBC 2<I>.x</I> driver, the Driver Manager maps SQL_UB_VARIABLE to SQL_UB_FIXED.</P>
+#
+# <P>To use bookmarks with a cursor, the application must specify this attribute with the SQL_UB_VARIABLE value before opening the cursor.</P>
+#
+# <P>For more information, see "<A HREF="odbcretrieving_bookmarks.htm">Retrieving Bookmarks</A>" in Chapter 11: Retrieving Results (Advanced).</P>
+# </TD>
+# </TR>
+ SQL_ATTR_USE_BOOKMARKS => {
+ type => q(SQLUINTEGER),
+ ptr => 0,
+ value => [ qw(SQL_UB_OFF SQL_UB_VARIABLE SQL_UB_FIXED) ],
+ default => undef,
+ mode => 'rw',
+ order => ++$order,
+ },
+# </table></div>
+#
+# <P class="fineprint">[1]&nbsp;&nbsp;&nbsp;These functions can be called asynchronously only if the descriptor is an implementation descriptor, not an application descriptor.</p>
+# <P>See "<A HREF="odbccolumn_wise_binding.htm">Column-Wise Binding</A>" and "<A HREF="odbcrow_wise_binding.htm">Row-Wise Binding</A>" in Chapter 11: Retrieving Results (Advanced).</P>
+#
+# <P class="label"><B>Related Functions</B></P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=47%>For information about</TH>
+# <TH width=53%>See</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=47%>Canceling statement processing</TD>
+# <TD width=53%><A HREF="odbcsqlcancel.htm">SQLCancel</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=47%>Returning the setting of a connection attribute</TD>
+# <TD width=53%><A HREF="odbcsqlgetconnectattr.htm">SQLGetConnectAttr</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=47%>Returning the setting of a statement attribute</TD>
+# <TD width=53%><A HREF="odbcsqlgetstmtattr.htm">SQLGetStmtAttr</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=47%>Setting a connection attribute</TD>
+# <TD width=53%><A HREF="odbcsqlsetconnectattr.htm">SQLSetConnectAttr</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=47%>Setting a single field of the descriptor</TD>
+# <TD width=53%><A HREF="odbcsqlsetdescfield.htm">SQLSetDescField</A></TD>
+# </TR>
+# </table></div>
+# <!--TS:--><H4><A NAME="feedback"></A></H4>
+# <SPAN id="SDKFeedB"></SPAN>
+# </div>
+#
+# </BODY>
+# </HTML>
+};
+
+my $i3 = " " x 3;
+my $i4 = " " x 4;
+my $i8 = " " x 8;
+
+my $type2type = {
+ SQLSMALLINT => 'Smallint',
+ SQLUSMALLINT => 'Usmallint',
+ SQLINTEGER => 'Integer',
+ SQLUINTEGER => 'Uinteger',
+ SQLPOINTER => 'Pointer',
+ SQLCHAR => 'Sqlchar',
+};
+
+my $attr =
+ $type eq 'Env' ? $attrEnv :
+ $type eq 'Dbc' ? $attrDbc :
+ $type eq 'Stmt' ? $attrStmt : die "bad type $type";
+
+my @name = sort {
+ $attr->{$a}{order} <=> $attr->{$b}{order}
+} keys %$attr;
+
+print "#include \"Handle$type.hpp\"\n";
+my $class = "OdbcData";
+
+for my $name (@name) {
+ my $p = $attr->{$name};
+ my $odbctype = $type2type->{$p->{type}} or die $name;
+ $odbctype .= "Ptr" if $p->{ptr};
+ print "\nstatic void\n";
+ print "callback_${name}_set(Ctx& ctx, HandleBase* self, const $class& data)\n";
+ print "{\n";
+ print "${i4}Handle$type* p$type = dynamic_cast<Handle$type*>(self);\n";
+ print "${i4}assert(p$type != 0 && data.type() == ${class}::$odbctype);\n";
+ print "}\n";
+ print "\nstatic void\n";
+ print "callback_${name}_default(Ctx& ctx, HandleBase* self, $class& data)\n";
+ print "{\n";
+ print "${i4}Handle$type* p$type = dynamic_cast<Handle$type*>(self);\n";
+ print "${i4}assert(p$type != 0);\n";
+ print "${i4}data.set();\n";
+ print "}\n";
+}
+
+print "\nAttrSpec Handle${type}::m_attrSpec\[\] = {\n";
+for my $name (@name) {
+ my $p = $attr->{$name};
+ my $odbctype = $type2type->{$p->{type}} or die $name;
+ $odbctype .= "Ptr" if $p->{ptr};
+ print "${i4}\{${i3}$name,\n";
+ print "${i8}${class}::$odbctype,\n";
+ my $attrmode =
+ $p->{mode} eq 'rw' ? 'Attr_mode_readwrite' :
+ $p->{mode} eq 'ro' ? 'Attr_mode_readonly' : die "bad mode $p->{mode}";
+ print "${i8}$attrmode,\n";
+ print "${i8}callback_${name}_set,\n";
+ print "${i8}callback_${name}_default,\n";
+ print "${i4}\},\n";
+}
+print "${i4}\{${i3}0,\n";
+print "${i8}${class}::Undef,\n";
+print "${i8}Attr_mode_undef,\n";
+print "${i8}0,\n";
+print "${i8}0,\n";
+print "${i4}\},\n";
+
+print "};\n";
diff --git a/storage/ndb/src/old_files/client/odbc/docs/main.hpp b/storage/ndb/src/old_files/client/odbc/docs/main.hpp
new file mode 100644
index 00000000000..ebb5b1f235a
--- /dev/null
+++ b/storage/ndb/src/old_files/client/odbc/docs/main.hpp
@@ -0,0 +1,104 @@
+/* Copyright (C) 2003 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+/**
+ @mainpage NDB ODBC
+
+ The ODBC Driver Frontend has:
+ -# HandleBase : Various ODBC handles
+ -# AttrArea : Attributes of handles
+ -# ConnArea : Communication area on connection level between driver parts
+ -# StmtArea : Communication area on statement level between driver parts
+
+ and controls the following steps:
+ -# SQL_compiler : Compiles SQL into SQL_code_tree:s
+ -# Parser : Bison grammar
+ -# Analyzer : Syntactic and semantic checks (binds names)
+ -# PlanGen : Generate initial (execution) plan (PlanTree)
+ -# CodeGen : Generates CodeTree:s out of PlanTree:s
+ -# Optimizer : Optimizes PlanTree:s
+ -# Output : Outputs executable CodeTree:s
+ -# Executor : Executes CodeTree:s
+ -# CodeTree::allocRun : Allocates runtime data structures (RunTree:s)
+ -# Dataflow machine : Executes and evaluates statement and expressions
+
+ The Dataflow machine works in four different ways:
+ -# Non-query statements
+ -# CodeStmt::execute : Executes (non-query) statement
+ -# Query statements
+ -# CodeQuery::execute : Execute Query statement
+ -# CodeQuery::fetch : Fetch row from CodeQuery node
+ -# Boolean expressions
+ -# CodePred::evaluate : Evaluates boolean expression
+ -# Arithmetical expressions
+ -# CodeExpr::evaluate : Evaluates arithmetic expression
+
+ The following components are used throughout the NDB ODBC:
+ -# Context (Ctx) : Info regarding execution/evaluation
+ -# Diagnostic area (DiagArea) : Errors and warnings (for ODBC user)
+ -# DescArea : Description of ODBC user input/output bind varibles/columns
+ -# Dictionary (DictBase) : Lookup info stored in NDB Dictionary
+ and info regarding temporary
+ materialized results
+ -# ResultArea : Execution (temporary) results
+
+
+ @section secCompiler SQL_compiler : SQL to SQL_code_tree
+
+ The SQL_compiler takes an <em>SQL statement</em> and translates
+ it into an SQL_code_tree. The compiler uses an SQL_code_tree
+ internally during the compilation and the result of the compilation
+ is a simlified SQL_code_tree.
+
+ The compiler works in the following steps:
+ -# Parse SQL statments and create SQL_code_tree representing the
+ statement.
+ -# Apply Syntax Rules to the SQL_code_tree. Syntax rules are
+ rules which are <em>not</em> expressed in the SQL grammar,
+ but are expressed in natural language in the SQL specification.
+ -# Apply Access Rules to the SQL_code_tree
+ (this is not implemented, since NDB Cluster has no access control)
+ -# Apply General Rules to the SQL_code_tree
+ -# Apply Conformance Rules to the SQL_code_tree
+
+ The resulting simplified SQL_code_tree is represented by a
+ tree of C++ objects.
+
+
+ @section secCodegen Codegen : SQL_code_tree to CodeTree
+
+ CodeGen takes simplified SQL_code_tree:s and transforms them into
+ CodeTree:s.
+
+
+ @section secOptimizer Optimizer : CodeTree to CodeTree
+
+ The implementation of the ODBC optimizer will uses the
+ PlanTree:s to represent statements and transforms them
+ into executable format (still PlanTree format).
+
+ @note In the future, more optimizations can be implemented.
+
+
+ @section secExecutor Executor : Execute CodeTree
+
+ The Executor uses the following data structures:
+ -# CodeTree : A read-only quary evaluation plan
+ -# RunTree : Runtime data structures containing ResultSet:s
+
+ The execution mechanism is actually implemented as a
+ part of the CodeTree.
+*/
diff --git a/storage/ndb/src/old_files/client/odbc/docs/ndbodbc.html b/storage/ndb/src/old_files/client/odbc/docs/ndbodbc.html
new file mode 100644
index 00000000000..6be624dfa1b
--- /dev/null
+++ b/storage/ndb/src/old_files/client/odbc/docs/ndbodbc.html
@@ -0,0 +1,659 @@
+<HTML>
+<HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
+<TITLE>ODBC and SQL</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#ffffff">
+
+<h2>ODBC and SQL - NDB Cluster v2.11</h2>
+
+<p>
+NDB Cluster v2.11 includes a version of ODBC and SQL.
+<p>
+This document has 4 sections.
+<ol>
+<li>PLATFORMS
+<li>ODBC
+<li>SQL
+<li>DIAGNOSTICS
+</ol>
+<p>
+Features which are currently incomplete or planned for next release
+are marked with <b>v2.x</b>.
+
+<h3>1. PLATFORMS</h3>
+
+<h4>1.1 Linux / Unix</h4>
+<p>
+We use RedHat package names to describe supporting software.
+Packages starting with <b>perl-</b> are perl modules.
+If your installation does not include them you can get them
+from a CPAN archive ( <tt><b>ftp://ftp.funet.fi/pub/languages/perl/CPAN</b></tt> ).
+<p>
+Version numbers are given only as examples.
+Other versions will work.
+<p>
+An ODBC driver manager is required, one of:
+<ul>
+<li>unixODBC-2.2.3 (this is more common)
+<li>libiodbc-3.0.5
+</ul>
+<p>
+Additional packages are convenient.
+Following include perl scripting interface
+and an "interactive SQL" tool <b>dbish</b>:
+<ul>
+<li>perl-DBI-1.30
+<li>perl-DBD-ODBC-0.43
+<li>readline-4.2
+<li>perl-Term-ReadLine-Gnu-1.11
+</ul>
+<p>
+The NDB ODBC driver is located under NDB Cluster installation
+directory and is named <tt><b>libNDB_ODBC.so</b></tt>.
+It includes NDB API.
+To use it create a text file
+<tt><b>/etc/odbc.ini</b></tt> or <tt><b>$HOME/.odbc.ini</b></tt>
+containing at least:
+<p>
+<tt>
+<b>
+[ndb]
+<br>
+Driver = &lt;path-to-your-NDB-installation&gt;/lib/libNDB_ODBC.so
+</b>
+</tt>
+<p>
+Then try the shell command <tt><b>dbish dbi:ODBC:ndb</b></tt>
+in an NDB API node directory.
+
+<h4>1.2 Windows</h4>
+
+[ TODO - documentation ]
+
+<h3>2. ODBC</h3>
+
+<h4>2.1 External data types</h4>
+
+Usual external data types are supported and converted to and from SQL
+data types.
+<p>
+<table width="80%" border=1>
+<tr align="left"><th width="40%">type</th> <th>description</th></tr>
+<tr align="left"><td>SQL_C_CHAR</td><td>character buffers</tr>
+<tr align="left"><td>SQL_C_SLONG, etc</td><td>integer types</tr>
+<tr align="left"><td>SQL_C_DOUBLE, etc</td><td>floating types</tr>
+<tr align="left"><td>SQL_C_TYPE_TIMESTAMP</td><td>timestamp</tr>
+</table>
+
+<h4>2.2 ODBC functions</h4>
+<p>
+The driver implements basic ODBC functions.
+Main exceptions are:
+<ul>
+<li>no named cursors
+<li>no scrollable cursors
+<li>no bulk operations
+<li>no asynchronous execution
+</ul>
+<p>
+Following lists main ODBC 3.0 functions and
+their status in the driver.
+<p>
+<table width="80%" border=1>
+<tr align="left"><th width="40%">function</th><th>supported</th></tr>
+<tr align="left"><td>SQLAllocHandle</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLConnect</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLGetInfo</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLGetFunctions</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLGetTypeInfo</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLSetConnectAttr</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLGetConnectAttr</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLSetEnvAttr</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLGetEnvAttr</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLSetStmtAttr</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLGetStmtAttr</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLGetDescField</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLGetDescRec</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLSetDescField</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLSetDescRec</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLPrepare</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLBindParameter</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLGetCursorName</td><td>
+yes, but cursor names cannot be used in SQL
+</td></tr>
+<tr align="left"><td>SQLSetCursorName</td><td>
+yes, but cursor names cannot be used in SQL
+</td></tr>
+<tr align="left"><td>SQLSetScrollOptions</td><td>
+not implemented
+</td></tr>
+<tr align="left"><td>SQLExecute</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLExecDirect</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLNativeSql</td><td>
+not implemented
+</td></tr>
+<tr align="left"><td>SQLDescribeParam</td><td>
+not supported
+</td></tr>
+<tr align="left"><td>SQLNumParams</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLParamData</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLPutData</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLRowCount</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLNumResultCols</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLDescribeCol</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLColAttribute</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLBindCol</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLFetch</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLFetchScroll</td><td>
+not implemented
+</td></tr>
+<tr align="left"><td>SQLGetData</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLSetPos</td><td>
+not implemented
+</td></tr>
+<tr align="left"><td>SQLBulkOperations</td><td>
+not implemented
+</td></tr>
+<tr align="left"><td>SQLMoreResults</td><td>
+yes, but multiple result sets are not supported
+</td></tr>
+<tr align="left"><td>SQLGetDiagField</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLGetDiagRec</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLColumnPrivileges</td><td>
+not applicable
+</td></tr>
+<tr align="left"><td>SQLColumns</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLForeignKeys</td><td>
+not applicable
+</td></tr>
+<tr align="left"><td>SQLPrimaryKeys</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLProcedureColumns</td><td>
+not applicable
+</td></tr>
+<tr align="left"><td>SQLProcedures</td><td>
+not applicable
+</td></tr>
+<tr align="left"><td>SQLSpecialColumns</td><td>
+yes <b>v2.x</b>
+</td></tr>
+<tr align="left"><td>SQLStatistics</td><td>
+not applicable
+</td></tr>
+<tr align="left"><td>SQLTablePrivileges</td><td>
+not applicable
+</td></tr>
+<tr align="left"><td>SQLTables</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLFreeStmt</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLCloseCursor</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLCancel</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLEndTran</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLDisconnect</td><td>
+yes
+</td></tr>
+<tr align="left"><td>SQLFreeHandle</td><td>
+yes
+</td></tr>
+</table>
+
+<h3>3. SQL</h3>
+
+<h4>3.1 Data types</h4>
+
+<table width="80%" border=1>
+<tr align="left"><th width="40%">type</th> <th>description</th></tr>
+<tr align="left"><td>CHAR(n)</td><td>fixed-width blank-padded string</tr>
+<tr align="left"><td>VARCHAR(n)</td><td>variable length string</tr>
+<tr align="left"><td>INT<br>INTEGER</td><td>integer 32 bits</tr>
+<tr align="left"><td>BIGINT</td><td>integer 64 bits</tr>
+<tr align="left"><td>DECIMAL(m,n)</td><td>exact number with precision and scale <b>v2.x</b></tr>
+<tr align="left"><td>REAL</td><td>float 32 bits</tr>
+<tr align="left"><td>FLOAT<br>DOUBLE PRECISION</td><td>float, at least 64 bits</tr>
+<tr align="left"><td>DATE</td><td>date with precision 1 second <b>v2.x</b></tr>
+<tr align="left"><td>DATETIME</td><td>date with precision 1 nanosecond (SQL_TYPE_TIMESTAMP)</tr>
+</table>
+<p>
+
+Integer types may be qualified as UNSIGNED.
+<br><br>
+Strings and numbers are not converted to each other automatically.
+Following is an error (unlike in oracle).
+<br>
+<pre><tt>select 123 + '456' from tab</tt></pre>
+
+<h4>3.2 Expressions</h4>
+
+<table width="80%" border=1>
+<tr align="left"><th width="40%">syntax</th> <th>description</th></tr>
+<tr align="left"><td align="center"><b>NULL</b></td><td>null value</td></tr>
+<tr align="left"><td align="center">12.34<b>e</b>5</td><td>integer or decimal or float constant</td></tr>
+<tr align="left"><td align="center"><b>'</b>abc<b>'</b></td><td>string constant</td></tr>
+<tr align="left"><td align="center"><b>+ - * / ( )</b></td><td>arithmetic operations</td></tr>
+<tr align="left"><td align="center"><b>||</b></td><td>string concatenation <b>v2.x</b></td></tr>
+</table>
+
+<br>
+Integer and decimal arithmetic is done in BIGINT.
+<br>
+Floating arithmetic is done in DOUBLE PRECISION.
+<br>
+Numeric literals use largest applicable type.
+<br>
+String operations are done in CHAR or in VARCHAR (if any operand is VARCHAR).
+<br>
+String literals have type CHAR.
+
+<h4>3.3 Functions : non-aggregate</h4>
+
+<table width="80%" border=1>
+<tr align="left"><th width="40%">syntax</th> <th>description</th></tr>
+<tr align="left"><td align="center">SUBSTR() LEFT() RIGHT()</td><td>substring</td></tr>
+<tr align="left"><td align="center">TO_NUMBER() TO_CHAR()</td><td>basic conversions <b>v2.x</b></td></tr>
+<tr align="left"><td align="center">ROWNUM</td><td>row number in query</td></tr>
+<tr align="left"><td align="center">SYSDATE</td><td>current date as DATETIME</td></tr>
+</table>
+
+<h4>3.4 Functions : aggregate</h4>
+
+<table width="80%" border=1>
+<tr align="left"><th width="40%">syntax</th> <th>description</th></tr>
+<tr align="left"><td align="center">COUNT(*) COUNT(expr)</td><td>count rows or non-NULL values</td></tr>
+<tr align="left"><td align="center">MIN(expr) MAX(expr)</td><td>min and max of strings and numbers</td></tr>
+<tr align="left"><td align="center">SUM(expr) AVG(expr)</td><td>sum and average of numbers</td></tr>
+</table>
+<br>
+GROUP BY and HAVING are supported.
+
+<h4>3.5 Predicates</h4>
+
+<table width="80%" border=1>
+<tr align="left"><th width="40%">syntax</th> <th>description</th></tr>
+<tr align="left"><td align="center">IS NULL / IS NOT NULL</td><td>test if value is null</td></tr>
+<tr align="left"><td align="center"><b>&lt; &lt;= = != &gt; &gt=</b></td><td>comparisons</td></tr>
+<tr align="left"><td align="center">LIKE / NOT LIKE</td><td>string matching</td></tr>
+<tr align="left"><td align="center">AND OR NOT <b>( )</b></td><td>boolean operators</td></tr>
+</table>
+
+<h4>3.6 Tables</h4>
+
+An NDB table requires a primary key.
+There are 2 ways to specify it.
+
+<p>
+<h4>Case 1</h4>
+<pre><tt>create table t (
+ a integer not null,
+ b char(20) not null,
+ c float,
+ primary key(a, b)
+)
+</tt></pre>
+<p>
+<h4>Case 2</h4>
+<p>
+A column can be specified as AUTO_INCREMENT.
+The column has following requirements.
+<ul>
+<li>it must be the primary key (not just part of one)
+<li>its type must be one of the integer types
+</ul>
+<pre><tt>create table t (
+ a int unsigned auto_increment primary key,
+ b char(20) not null,
+ c float
+)
+</tt></pre>
+<p>
+The values of an AUTO_INCREMENT column are unique (until wrap-around)
+and form an ascending sequence.
+Gaps in the sequence are possible.
+<h4>Default values</h4>
+Columns can be specified with DEFAULT value
+which is used on insert if the column is not on the insert list.
+<p>
+<pre><tt>create table t (
+ a int primary key,
+ b int default 100
+)
+insert into t(a) values(1) -- inserts (1,100)
+</tt></pre>
+<p>
+The value must evaluate to constant.
+Using SYSDATE (if allowed at all) evaluates to table creation time.
+<p>
+
+<h4>Logging / nologging</h4>
+
+By default tables are created in logging mode, meaning the data
+is preserved across database restart.
+The mode can be specified explicitly:
+<p>
+<tt>create table t1 (a int primary key, b int) logging</tt>
+<br>
+<tt>create table t1 (a int primary key, b int) nologging</tt>
+
+<h4>Schemas</h4>
+
+Schemas do not exist in current NDB Cluster.
+As a convenience, a single period is allowed in table names:
+<p>
+<pre><tt>create table mydb.mytable (a int primary key)</tt></pre>
+<p>
+
+<h4>Drop table</h4>
+
+Deletes a table, all of its indexes, and all data:
+<p>
+<tt>drop table t</tt>
+
+<h4>3.7 Indexes</h4>
+Only unique non-ordered indexes exist currently.
+The columns must be not nullable and are stored in same
+order as underlying table columns.
+<p>
+<tt>create unique hash index x1 on t1(b, c) logging</tt>
+<p>
+Internally, a unique hash index is a table where index key is primary key.
+If the index is <tt>nologging</tt>, it is rebuilt on database restart
+before the database is opened.
+<p>
+Indexes can of course be dropped:
+<p>
+<tt>drop index x1</tt>
+
+<h4>3.8 Select</h4>
+
+Features:
+
+<ul>
+<li>Expressions and predicates
+<br><tt>select a + b * c from t where a &lt; b + c and (b &gt; c or c &gt; 10)</tt>
+<li>JOIN to any depth
+<br><tt>select a.x, b.y, c.z from t1 a, t2 b, t2 c where a.x + b.y &lt; c.z</tt>
+<li>ORDER BY
+<br><tt>select * from t1, t2 where a1 &gt; 5 order by b1 + b2, c1 desc</tt>
+<li>DISTINCT
+<br><tt>select distinct a, b + c from t</tt>
+<li>Aggregates without grouping.
+<br><tt>select count(*), max(a), 1 + sum(b) + avg(c * d) from t</tt>
+<li>Aggregates with grouping.
+<br><tt>select a, sum(b) from t group by a having sum(c) &gt; 0 order by a, sum(d)</tt>
+</ul>
+
+Major omissions:
+<ul>
+<li>no OUTER JOIN
+<li>no subqueries and no EXISTS clause
+</ul>
+
+Queries are optimized to minimize scans,
+by using primary keys and existing unique hash indexes.
+Simple predicates in scans (column compared to constant)
+are passed to an interpreter in NDB kernel.
+Joins are done via <em>nested loops</em> only.
+<p>
+<ul>
+<li>SCAN
+<br><tt>select * from t where a &lt; b</tt>
+<li>INTERPRETED SCAN (much faster)
+<br><tt>select * from t1, t2 where t1.a &lt; 10 and t2.b &gt; t1.c</tt>
+<li>PRIMARY KEY lookup
+<br><tt>select * from t where pk = 5 and b &gt; 10</tt>
+<li>NESTED LOOPS
+<br><tt>select * from t1, t2, t3 where t1.pk = t2.x and t2.pk = t3.y</tt>
+</ul>
+
+<h4>3.9 Insert and write</h4>
+
+Both VALUES and subquery variants can be used.
+<p>
+<pre><tt>insert into t(a, c) values (123, 'abc')
+insert into t1(a, c) select a + 10 * b, c from t2
+</tt></pre>
+<p>
+For convenience, the non-standard <i>MySql</i> syntax is also supported.
+<p>
+<pre><tt>insert into t set a = 123, c = 'abc'</tt></pre>
+<p>
+The non-standard operation WRITE is used exactly like INSERT.
+The record is updated if it exists.
+Otherwise a new record is inserted.
+<p>
+<pre><tt>write into t(a, c) values (123, 'abc')
+</tt></pre>
+
+<h4>3.10 Update</h4>
+
+Update allows no subqueries.
+Update is optimized to minimize scans and reads,
+by using primary keys and existing unique hash indexes.
+<p>
+<ul>
+<li>SCAN
+<br><tt>update t set a = b + 5, c = d where c &gt; 10</tt>
+<li>PRIMARY KEY or INDEX lookup
+<br><tt>update t set a = b + 5, c = d where pk = 5 and c &gt; 10</tt>
+<li>PRIMARY KEY or INDEX direct
+<br><tt>update t set a = 5, c = 7 where pk = 5</tt>
+</ul>
+
+<h4>3.11 Delete</h4>
+
+Delete allows no subqueries.
+Delete is optimized to minimize scans and reads,
+by using primary keys and existing unique hash indexes.
+<p>
+<ul>
+<li>SCAN
+<br><tt>delete from t where c &gt; 10</tt>
+<li>PRIMARY KEY or INDEX lookup
+<br><tt>delete from t where pk = 5 and c &gt; 10</tt>
+<li>PRIMARY KEY or INDEX direct
+<br><tt>delete from t where pk = 5</tt>
+</ul>
+
+<h4>3.12 Virtual tables</h4>
+
+The driver implements some virtual tables.
+They can only be queried, not modified.
+<p>
+<ul>
+<li>DUAL
+<br>A 1-row table - example: select SYSDATE from DUAL.
+<li>ODBC$TYPEINFO
+<br>Corresponds to SQLGetTypeInfo.
+<li>ODBC$TABLES
+<br>Corresponds to SQLTables but shows all NDB kernel objects.
+<li>ODBC$COLUMNS
+<br>Corresponds to SQLColumns.
+<li>ODBC$PRIMARYKEYS
+<br>Corresponds to SQLPrimaryKeys.
+</ul>
+
+<h3>4. DIAGNOSTICS</h3>
+
+<h4>4.1 Diagnostic records</h4>
+
+The driver manager and driver return 3 main diagnostics
+(see <b><tt>SQLGetDiagRec</tt></b>).
+<ul>
+<li>SQLSTATE (a string of 5 characters)
+<li>Native error code
+<li>Message text
+</ul>
+<p>
+Message text format is
+<br><br>
+<b><tt>[Alzato][ODBC driver][NDB Cluster] NDB-ssccnnn <i>error text</i> (in SQLXxx)</tt></b>
+<br><br>
+Here <b>ssccnnnn</b> is native error code (decimal number), with following parts:
+<p>
+<li><b><tt>ss</tt></b> - status
+<li><b><tt>cc</tt></b> - classification
+<li><b><tt>nnnn</tt></b> - error code
+</ul>
+<p>
+See NDB API guide for further information.
+<p>
+For non-database errors the last prefix <b><tt>[NDB Cluster]</tt></b> is omitted
+and native error code is always 02015001.
+
+<h4>4.2 Tracing</h4>
+
+Following environment variables may be useful.
+<ul>
+<li><b><tt>NDB_ODBC_TRACE</tt></b>
+<br>
+Values &ge; 2 cause SQL execution plan
+to be printed on standard output.
+<br>
+Values &ge; 3 show the ODBC API functions
+called by the driver manager.
+<br><br>
+<li><b><tt>NDB_ODBC_DEBUG</tt></b>
+<br>
+Non-zero value makes the driver abort
+the application on unhandled conditions.
+<br>
+By default the ODBC API function is aborted gracefully.
+</ul>
+
+<h4>4.3 Thread safety</h4>
+<p>
+The driver has same thread-safety model as NDB API.
+In NDB API each thread must use its own <b><tt>Ndb</tt></b> object.
+In NDB ODBC a <b><tt>SQLConnect</tt></b> corresponds to an <b><tt>Ndb</tt></b> object.
+It is required that each thread allocates its
+own ODBC handles (of all types).
+
+<h4>4.4 Data formats</h4>
+<p>
+SQL types are represented as (old) NDB types as follows.
+<p>
+<table width="80%" border=1>
+<tr align="left"><th width="20%">SQL type</th> <th>NDB type</th></tr>
+<tr align="left"><td align="left">CHAR(n)</td><td>String(n), blank-padded to n</td></tr>
+<tr align="left"><td align="left">VARCHAR(n)</td><td>String(n+2), zero-padded to n, length in last 2 bytes (big-endian)</td></tr>
+<tr align="left"><td align="left">integers</td><td>Signed(x) or UnSigned(x), x=16,32,64, native format</td></tr>
+<tr align="left"><td align="left">floats</td><td>Float(x), x=32,64, native format</td></tr>
+<tr align="left"><td align="left">DATETIME</td><td>String(12) = cc yy mm dd HH MM SS \0 ff ff ff ff (big-endian)</td></tr>
+</table>
+<p>
+Note: SQL types exist now in NDB API in <b><tt>NdbDictionary</tt></b> class.
+However they are not yet understood by NDB API operations.
+
+<h4>4.5 NDB Cluster limitations</h4>
+<p>
+<ul>
+<li>Isolation level is READ COMMITTED.
+A scan (non-primary-key select of several rows) does not see consistent data.
+<br><br>
+<li>Inserting into a table from itself is likely to cause a deadlock
+or a random result.
+<br><tt><b>no:</b> insert into t(a, b) select a*100, b+100 from t</tt>
+<br><br>
+<li>Number of uncommitted rows is limited by NDB configuration
+parameter <b><tt>MaxNoOfConcurrentOperations</tt></b> (typical default 4096).
+To delete all rows from a large table one may need to do repeatedly:
+<br><tt>delete from t where rownum < 4000</tt>
+</ul>
+
+<h4>4.6 Known problems v2.11</h4>
+<p>
+Following lists specific known problems.
+<ul>
+<li>ORDER BY works only with expressions,
+not with column aliases or positions.
+<br><tt><b>no:</b> select a+b x from t order by x</tt>
+<br><tt><b>no:</b> select * from t order by 1, 2, 3</tt>
+<br><br>
+<li>Join optimizer does not always minimize number of scans.
+Changing the order of tables in the statement may help.
+</ul>
+
+<h4>4.7 Useful links</h4>
+<p>
+<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbc/htm/dasdkodbcoverview_whatsnew.asp/">Microsoft ODBC page</a>
+<br>
+<a href="http://www.unixodbc.org/">unixODBC home page</a>
+<br>
+<a href="http://www.iodbc.org/">iODBC home page</a>
+
+</BODY>
+</HTML>
diff --git a/storage/ndb/src/old_files/client/odbc/docs/select.fig b/storage/ndb/src/old_files/client/odbc/docs/select.fig
new file mode 100644
index 00000000000..4f51a2085b4
--- /dev/null
+++ b/storage/ndb/src/old_files/client/odbc/docs/select.fig
@@ -0,0 +1,94 @@
+#FIG 3.2
+Landscape
+Center
+Inches
+A4
+92.00
+Single
+-2
+1200 2
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 2700 2700 1500 3900
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 3150 2700 3150 3900
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 3600 4500 4800 5700
+2 1 1 1 0 7 50 0 -1 4.000 0 0 7 1 0 2
+ 0 0 1.00 60.00 120.00
+ 3600 2700 4800 3900
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 2775 4500 1200 5700
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 3150 4500 3150 5700
+2 4 0 1 0 7 50 0 -1 0.000 0 0 7 0 0 5
+ 2100 4500 2100 3900 600 3900 600 4500 2100 4500
+2 4 0 1 0 7 50 0 -1 0.000 0 0 7 0 0 5
+ 2100 6300 2100 5700 600 5700 600 6300 2100 6300
+2 4 0 1 0 7 50 0 -1 0.000 0 0 7 0 0 5
+ 3900 4500 3900 3900 2400 3900 2400 4500 3900 4500
+2 4 1 1 0 7 50 0 -1 4.000 0 0 7 0 0 5
+ 5700 4500 5700 3900 4200 3900 4200 4500 5700 4500
+2 4 0 1 0 7 50 0 -1 0.000 0 0 7 0 0 5
+ 3900 6300 3900 5700 2400 5700 2400 6300 3900 6300
+2 4 0 1 0 7 50 0 -1 0.000 0 0 7 0 0 5
+ 5700 6300 5700 5700 4200 5700 4200 6300 5700 6300
+2 4 0 1 0 7 50 0 -1 0.000 0 0 7 0 0 5
+ 8400 2700 8400 2100 6900 2100 6900 2700 8400 2700
+2 4 0 1 0 7 50 0 -1 0.000 0 0 7 0 0 5
+ 8400 6300 8400 5700 6900 5700 6900 6300 8400 6300
+2 1 0 1 0 7 50 0 -1 4.000 0 0 7 1 0 2
+ 0 0 1.00 60.00 120.00
+ 7650 2700 7650 5700
+2 1 0 1 0 7 50 0 -1 4.000 0 0 7 1 0 2
+ 0 0 1.00 60.00 120.00
+ 7650 6300 7650 7500
+2 1 1 1 0 7 50 0 -1 4.000 0 0 7 1 0 2
+ 0 0 1.00 60.00 120.00
+ 8100 6300 10575 6900
+2 1 0 1 0 7 50 0 -1 4.000 0 0 7 1 0 2
+ 0 0 1.00 60.00 120.00
+ 8100 2700 10575 3300
+2 4 0 1 0 7 50 0 -1 0.000 0 0 7 0 0 5
+ 11700 3900 11700 3300 10200 3300 10200 3900 11700 3900
+2 4 0 1 0 7 50 0 -1 0.000 0 0 7 0 0 5
+ 9900 5400 9900 4800 8400 4800 8400 5400 9900 5400
+2 4 0 1 0 7 50 0 -1 0.000 0 0 7 0 0 5
+ 11700 5400 11700 4800 10200 4800 10200 5400 11700 5400
+2 4 0 1 0 7 50 0 -1 0.000 0 0 7 0 0 5
+ 13500 5400 13500 4800 12000 4800 12000 5400 13500 5400
+2 1 0 1 0 7 50 0 -1 4.000 0 0 7 1 0 2
+ 0 0 1.00 60.00 120.00
+ 10500 3900 9300 4800
+2 1 0 1 0 7 50 0 -1 4.000 0 0 7 1 0 2
+ 0 0 1.00 60.00 120.00
+ 11400 3900 12600 4800
+2 1 0 1 0 7 50 0 -1 4.000 0 0 -1 1 0 2
+ 0 0 1.00 60.00 120.00
+ 10950 3900 10950 4800
+2 4 0 1 0 7 50 0 -1 0.000 0 0 7 0 0 5
+ 8400 8100 8400 7500 6900 7500 6900 8100 8400 8100
+2 4 0 1 0 7 50 0 -1 0.000 0 0 7 0 0 5
+ 3900 2700 3900 2100 2400 2100 2400 2700 3900 2700
+2 4 1 1 0 7 50 0 -1 4.000 0 0 7 0 0 5
+ 11700 7500 11700 6900 10200 6900 10200 7500 11700 7500
+4 0 0 50 0 14 12 0.0000 4 135 840 900 4275 table T1\001
+4 0 0 50 0 14 20 0.0000 4 240 4125 900 1125 select A, C, 123 from T1/\001
+4 0 0 50 0 14 12 0.0000 4 135 840 825 6075 column A\001
+4 0 0 50 0 14 12 0.0000 4 135 840 2775 6075 column C\001
+4 0 0 50 0 14 12 0.0000 4 135 945 4425 6075 const 123\001
+4 0 0 50 0 14 12 0.0000 4 135 630 4575 4275 clause\001
+4 0 0 50 0 14 12 0.0000 4 90 315 2925 4275 row\001
+4 0 0 50 0 14 12 0.0000 4 180 735 7200 2475 project\001
+4 0 0 50 0 14 12 0.0000 4 135 630 7200 6000 filter\001
+4 0 0 50 0 14 12 0.0000 4 135 840 8625 5100 column 1\001
+4 0 0 50 0 14 12 0.0000 4 135 840 10500 5100 column 2\001
+4 0 0 50 0 14 12 0.0000 4 135 945 12300 5100 const 123\001
+4 0 0 50 0 14 12 0.0000 4 90 315 10650 3600 row\001
+4 0 0 50 0 14 12 0.0000 4 150 840 7200 7800 scan 1,2\001
+4 0 0 50 0 14 12 0.0000 4 135 630 2850 2475 select\001
+4 0 0 50 0 14 12 0.0000 4 135 630 10500 7200 clause\001
diff --git a/storage/ndb/src/old_files/client/odbc/docs/systables.pl b/storage/ndb/src/old_files/client/odbc/docs/systables.pl
new file mode 100644
index 00000000000..728d966a7a4
--- /dev/null
+++ b/storage/ndb/src/old_files/client/odbc/docs/systables.pl
@@ -0,0 +1,2192 @@
+# usage: perl systables.pl {typeinfo|tables|columns|primarykeys} {-l|-c}
+use strict;
+my $what = shift;
+my $opt = shift;
+my $listWhat = {};
+
+#
+# odbcsqlgettypeinfo.htm
+#
+$listWhat->{typeinfo} = [
+# <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+# <HTML DIR="LTR"><HEAD>
+# <META HTTP-EQUIV="Content-Type" Content="text/html; charset=Windows-1252">
+# <TITLE>SQLGetTypeInfo</TITLE>
+# <SCRIPT SRC="/stylesheets/vs70link.js"></SCRIPT>
+# <SCRIPT SRC="/stylesheets/vs70.js"></SCRIPT>
+# <SCRIPT LANGUAGE="JScript" SRC="/stylesheets/odbc.js"></SCRIPT>
+# </HEAD>
+# <body topmargin=0 id="bodyID">
+#
+# <div id="nsbanner">
+# <div id="bannertitle">
+# <TABLE CLASS="bannerparthead" CELLSPACING=0>
+# <TR ID="hdr">
+# <TD CLASS="bannertitle" nowrap>
+# ODBC Programmer's Reference
+# </TD><TD valign=middle><a href="#Feedback"><IMG name="feedb" onclick=EMailStream(SDKFeedB) style="CURSOR: hand;" hspace=15 alt="" src="/stylesheets/mailto.gif" align=right></a></TD>
+# </TR>
+# </TABLE>
+# </div>
+# </div>
+# <DIV id="nstext" valign="bottom">
+#
+# <H1><A NAME="odbcsqlgettypeinfo"></A>SQLGetTypeInfo</H1>
+#
+# <P class="label"><B>Conformance</B></P>
+#
+# <P>Version Introduced: ODBC 1.0<BR>
+# Standards Compliance: ISO 92</P>
+#
+# <P class="label"><B>Summary</B></P>
+#
+# <P><B>SQLGetTypeInfo</B> returns information about data types supported by the data source. The driver returns the information in the form of an SQL result set. The data types are intended for use in Data Definition Language (DDL) statements.</P>
+#
+# <P class="indent"><b class="le">Important&nbsp;&nbsp;&nbsp;</b>Applications must use the type names returned in the TYPE_NAME column of the <B>SQLGetTypeInfo</B> result set in <B>ALTER TABLE</B> and <B>CREATE TABLE</B> statements. <B>SQLGetTypeInfo</B> may return more than one row with the same value in the DATA_TYPE column.</P>
+#
+# <P class="label"><B>Syntax</B></P>
+#
+# <PRE class="syntax">SQLRETURN <B>SQLGetTypeInfo</B>(
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLHSTMT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>StatementHandle</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLSMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>DataType</I>);</PRE>
+#
+# <P class="label"><B>Arguments</B>
+#
+# <DL>
+# <DT><I>StatementHandle</I></DT>
+#
+# <DD>[Input]<BR>
+# Statement handle for the result set.</dd>
+#
+# <DT><I>DataType</I></DT>
+#
+# <DD>[Input]<BR>
+# The SQL data type. This must be one of the values in the "<A HREF="odbcsql_data_types.htm">SQL Data Types</A>" section of Appendix D: Data Types, or a driver-specific SQL data type. SQL_ALL_TYPES specifies that information about all data types should be returned.</dd>
+# </DL>
+#
+# <P class="label"><B>Returns</B></P>
+#
+# <P>SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR, or SQL_INVALID_HANDLE.</P>
+#
+# <P class="label"><B>Diagnostics</B></P>
+#
+# <P>When <B>SQLGetTypeInfo</B> returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value can be obtained by calling <B>SQLGetDiagRec</B> with a <I>HandleType</I> of SQL_HANDLE_STMT and a <I>Handle</I> of <I>StatementHandle</I>. The following table lists the SQLSTATE values commonly returned by <B>SQLGetTypeInfo </B>and explains each one in the context of this function; the notation "(DM)" precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=22%>SQLSTATE</TH>
+# <TH width=26%>Error</TH>
+# <TH width=52%>Description</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>01000</TD>
+# <TD width=26%>General warning</TD>
+# <TD width=52%>Driver-specific informational message. (Function returns SQL_SUCCESS_WITH_INFO.)</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>01S02</TD>
+# <TD width=26%>Option value changed</TD>
+# <TD width=52%>A specified statement attribute was invalid because of implementation working conditions, so a similar value was temporarily substituted. (Call <B>SQLGetStmtAttr</B> to determine the temporarily substituted value.) The substitute value is valid for the <I>StatementHandle</I> until the cursor is closed. The statement attributes that can be changed are: SQL_ATTR_CONCURRENCY, SQL_ATTR_CURSOR_TYPE, SQL_ATTR_KEYSET_SIZE, SQL_ATTR_MAX_LENGTH, SQL_ATTR_MAX_ROWS, SQL_ATTR_QUERY_TIMEOUT, and SQL_ATTR_SIMULATE_CURSOR. (Function returns SQL_SUCCESS_WITH_INFO.)</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>08S01</TD>
+# <TD width=26%>Communication link failure</TD>
+# <TD width=52%>The communication link between the driver and the data source to which the driver was connected failed before the function completed processing.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>24000</TD>
+# <TD width=26%>Invalid cursor state</TD>
+# <TD width=52%>A cursor was open on the <I>StatementHandle,</I> and <B>SQLFetch</B> or <B>SQLFetchScroll</B> had been called. This error is returned by the Driver Manager if <B>SQLFetch</B> or <B>SQLFetchScroll</B> has not returned SQL_NO_DATA, and is returned by the driver if <B>SQLFetch</B> or <B>SQLFetchScroll</B> has returned SQL_NO_DATA.
+# <P>A result set was open on the <I>StatementHandle</I>, but <B>SQLFetch</B> or <B>SQLFetchScroll</B> had not been called.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>40001</TD>
+# <TD width=26%>Serialization failure</TD>
+# <TD width=52%>The transaction was rolled back due to a resource deadlock with another transaction.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>40003</TD>
+# <TD width=26%>Statement completion unknown</TD>
+# <TD width=52%>The associated connection failed during the execution of this function and the state of the transaction cannot be determined.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY000</TD>
+# <TD width=26%>General error</TD>
+# <TD width=52%>An error occurred for which there was no specific SQLSTATE and for which no implementation-specific SQLSTATE was defined. The error message returned by <B>SQLGetDiagRec</B> in the <I>*MessageText</I> buffer describes the error and its cause. </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY001</TD>
+# <TD width=26%>Memory allocation error</TD>
+# <TD width=52%>The driver was unable to allocate memory required to support execution or completion of the function.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY004</TD>
+# <TD width=26%>Invalid SQL data type</TD>
+# <TD width=52%>The value specified for the argument <I>DataType</I> was neither a valid ODBC SQL data type identifier nor a driver-specific data type identifier supported by the driver.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY008</TD>
+# <TD width=26%>Operation canceled</TD>
+# <TD width=52%>Asynchronous processing was enabled for the <I>StatementHandle</I>, then the function was called and, before it completed execution, <B>SQLCancel</B> was called on the <I>StatementHandle</I>. Then the function was called again on the <I>StatementHandle</I>.
+# <P>The function was called and, before it completed execution, <B>SQLCancel</B> was called on the <I>StatementHandle</I> from a different thread in a multithread application.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY010</TD>
+# <TD width=26%>Function sequence error</TD>
+# <TD width=52%>(DM) An asynchronously executing function (not this one) was called for the <I>StatementHandle</I> and was still executing when this function was called.
+# <P>(DM) <B>SQLExecute</B>, <B>SQLExecDirect</B>, <B>SQLBulkOperations</B>, or <B>SQLSetPos</B> was called for the <I>StatementHandle</I> and returned SQL_NEED_DATA. This function was called before data was sent for all data-at-execution parameters or columns.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY013</TD>
+# <TD width=26%>Memory management error</TD>
+# <TD width=52%>The function call could not be processed because the underlying memory objects could not be accessed, possibly because of low memory conditions.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYC00</TD>
+# <TD width=26%>Optional feature not implemented</TD>
+# <TD width=52%>The combination of the current settings of the SQL_ATTR_CONCURRENCY and SQL_ATTR_CURSOR_TYPE statement attributes was not supported by the driver or data source.
+# <P>The SQL_ATTR_USE_BOOKMARKS statement attribute was set to SQL_UB_VARIABLE, and the SQL_ATTR_CURSOR_TYPE statement attribute was set to a cursor type for which the driver does not support bookmarks.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYT00</TD>
+# <TD width=26%>Timeout expired</TD>
+# <TD width=52%>The query timeout period expired before the data source returned the result set. The timeout period is set through <B>SQLSetStmtAttr</B>, SQL_ATTR_QUERY_TIMEOUT.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYT01</TD>
+# <TD width=26%>Connection timeout expired</TD>
+# <TD width=52%>The connection timeout period expired before the data source responded to the request. The connection timeout period is set through <B>SQLSetConnectAttr</B>, SQL_ATTR_CONNECTION_TIMEOUT.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>IM001</TD>
+# <TD width=26%>Driver does not support this function</TD>
+# <TD width=52%>(DM) The driver corresponding to the <I>StatementHandle</I> does not support the function.</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Comments</B></P>
+#
+# <P><B>SQLGetTypeInfo</B> returns the results as a standard result set, ordered by DATA_TYPE and then by how closely the data type maps to the corresponding ODBC SQL data type. Data types defined by the data source take precedence over user-defined data types. Consequently, the sort order is not necessarily consistent but can be generalized as DATA_TYPE first, followed by TYPE_NAME, both ascending. For example, suppose that a data source defined INTEGER and COUNTER data types, where COUNTER is auto-incrementing, and that a user-defined data type WHOLENUM has also been defined. These would be returned in the order INTEGER, WHOLENUM, and COUNTER, because WHOLENUM maps closely to the ODBC SQL data type SQL_INTEGER, while the auto-incrementing data type, even though supported by the data source, does not map closely to an ODBC SQL data type. For information about how this information might be used, see "<A HREF="odbcddl_statements.htm">DDL Statements</A>" in Chapter 8: SQL Statements.</P>
+#
+# <P>If the <I>DataType</I> argument specifies a data type which is valid for the version of ODBC supported by the driver, but is not supported by the driver, then it will return an empty result set. </P>
+#
+# <P class="indent"><b class="le">Note&nbsp;&nbsp;&nbsp;</b>For more information about the general use, arguments, and returned data of ODBC catalog functions, see <A HREF="odbccatalog_functions.htm">Chapter 7: Catalog Functions</A>.</P>
+#
+# <P>The following columns have been renamed for ODBC 3.<I>x</I>. The column name changes do not affect backward compatibility because applications bind by column number.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=48%>ODBC 2.0 column</TH>
+# <TH width=52%>ODBC 3.<I>x</I> column</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>PRECISION</TD>
+# <TD width=52%>COLUMN_SIZE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>MONEY</TD>
+# <TD width=52%>FIXED_PREC_SCALE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>AUTO_INCREMENT</TD>
+# <TD width=52%>AUTO_UNIQUE_VALUE</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P>The following columns have been added to the results set returned by <B>SQLGetTypeInfo</B> for ODBC 3.<I>x</I>:
+#
+# <UL type=disc>
+# <LI>SQL_DATA_TYPE</li>
+#
+# <LI>INTERVAL_PRECISION</li>
+#
+# <LI>SQL_DATETIME_SUB</li>
+#
+# <LI>NUM_PREC_RADIX</li>
+# </UL>
+#
+# <P>The following table lists the columns in the result set. Additional columns beyond column 19 (INTERVAL_PRECISION) can be defined by the driver. An application should gain access to driver-specific columns by counting down from the end of the result set rather than specifying an explicit ordinal position. For more information, see "<A HREF="odbcdata_returned_by_catalog_functions.htm">Data Returned by Catalog Functions</A>" in Chapter 7: Catalog Functions.</P>
+#
+# <P class="indent"><b class="le">Note</b>&nbsp;&nbsp;&nbsp;<B>SQLGetTypeInfo</B> might not return all data types. For example, a driver might not return user-defined data types. Applications can use any valid data type, regardless of whether it is returned by <B>SQLGetTypeInfo</B>.</P>
+#
+# <P class="indent">The data types returned by <B>SQLGetTypeInfo</B> are those supported by the data source. They are intended for use in Data Definition Language (DDL) statements. Drivers can return result-set data using data types other than the types returned by <B>SQLGetTypeInfo</B>. In creating the result set for a catalog function, the driver might use a data type that is not supported by the data source. </P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=33%><BR>
+# Column name</TH>
+# <TH width=14%>Column <BR>
+# number</TH>
+# <TH width=15%><BR>
+# Data type</TH>
+# <TH width=38%><BR>
+# Comments</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=33%>TYPE_NAME<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>1</TD>
+# <TD width=15%>Varchar<BR>
+# not NULL</TD>
+# <TD width=38%>Data source&#0150;dependent data-type name; for example, "CHAR()", "VARCHAR()", "MONEY", "LONG VARBINARY", or "CHAR ( ) FOR BIT DATA". Applications must use this name in <B>CREATE TABLE</B> and <B>ALTER TABLE</B> statements.</TD>
+# </TR>
+ { name => "type_name",
+ type => "varchar",
+ length => 20,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>DATA_TYPE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>2</TD>
+# <TD width=15%>Smallint<BR>
+# not NULL</TD>
+# <TD width=38%>SQL data type. This can be an ODBC SQL data type or a driver-specific SQL data type. For datetime or interval data types, this column returns the concise data type (such as SQL_TYPE_TIME or SQL_INTERVAL_YEAR_TO_MONTH). For a list of valid ODBC SQL data types, see "<A HREF="odbcsql_data_types.htm">SQL Data Types</A>" in Appendix D: Data Types. For information about driver-specific SQL data types, see the driver’s documentation.</TD>
+# </TR>
+ { name => "data_type",
+ type => "smallint",
+ length => undef,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>COLUMN_SIZE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>3</TD>
+# <TD width=15%>Integer</TD>
+# <TD width=38%>The maximum column size that the server supports for this data type. For numeric data, this is the maximum precision. For string data, this is the length in characters. For datetime data types, this is the length in characters of the string representation (assuming the maximum allowed precision of the fractional seconds component). NULL is returned for data types where column size is not applicable. For interval data types, this is the number of characters in the character representation of the interval literal (as defined by the interval leading precision; see "<A HREF="odbcinterval_data_type_length.htm">Interval Data Type Length</A>" in Appendix D: Data Types).
+# <P>For more information on column size, see "<A HREF="odbccolumn_size__decimal_digits__transfer_octet_length__and_display_size.htm">Column Size, Decimal Digits, Transfer Octet Length, and Display Size</A>" in Appendix D: Data Types.</P>
+# </TD>
+# </TR>
+ { name => "column_size",
+ type => "integer",
+ length => undef,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>LITERAL_PREFIX<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>4</TD>
+# <TD width=15%>Varchar</TD>
+# <TD width=38%>Character or characters used to prefix a literal; for example, a single quotation mark (') for character data types or 0x for binary data types; NULL is returned for data types where a literal prefix is not applicable.</TD>
+# </TR>
+ { name => "literal_prefix",
+ type => "varchar",
+ length => 1,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>LITERAL_SUFFIX<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>5</TD>
+# <TD width=15%>Varchar</TD>
+# <TD width=38%>Character or characters used to terminate a literal; for example, a single quotation mark (') for character data types; NULL is returned for data types where a literal suffix is not applicable.</TD>
+# </TR>
+ { name => "literal_suffix",
+ type => "varchar",
+ length => 1,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>CREATE_PARAMS<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>6</TD>
+# <TD width=15%>Varchar</TD>
+# <TD width=38%>A list of keywords, separated by commas, corresponding to each parameter that the application may specify in parentheses when using the name that is returned in the TYPE_NAME field. The keywords in the list can be any of the following: length, precision, or scale. They appear in the order that the syntax requires them to be used. For example, CREATE_PARAMS for DECIMAL would be "precision,scale"; CREATE_PARAMS for VARCHAR would equal "length." NULL is returned if there are no parameters for the data type definition; for example, INTEGER.
+# <P>The driver supplies the CREATE_PARAMS text in the language of the country where it is used.</P>
+# </TD>
+# </TR>
+ { name => "create_params",
+ type => "varchar",
+ length => 20,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>NULLABLE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>7</TD>
+# <TD width=15%>Smallint<BR>
+# not NULL</TD>
+# <TD width=38%>Whether the data type accepts a NULL value:
+# <P>SQL_NO_NULLS if the data type does not accept NULL values.</P>
+#
+# <P>SQL_NULLABLE if the data type accepts NULL values.</P>
+#
+# <P>SQL_NULLABLE_UNKNOWN if it is not known whether the column accepts NULL values.</P>
+# </TD>
+# </TR>
+ { name => "nullable",
+ type => "smallint",
+ length => undef,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>CASE_SENSITIVE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>8</TD>
+# <TD width=15%>Smallint<BR>
+# not NULL</TD>
+# <TD width=38%>Whether a character data type is case-sensitive in collations and comparisons:
+# <P>SQL_TRUE if the data type is a character data type and is case-sensitive.</P>
+#
+# <P>SQL_FALSE if the data type is not a character data type or is not case-sensitive.</P>
+# </TD>
+# </TR>
+ { name => "case_sensitive",
+ type => "smallint",
+ length => undef,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>SEARCHABLE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>9</TD>
+# <TD width=15%>Smallint<BR>
+# not NULL</TD>
+# <TD width=38%>How the data type is used in a <B>WHERE</B> clause:
+# <P>SQL_PRED_NONE if the column cannot be used in a <B>WHERE</B> clause. (This is the same as the SQL_UNSEARCHABLE value in ODBC 2.<I>x</I>.)</P>
+#
+# <P>SQL_PRED_CHAR if the column can be used in a <B>WHERE</B> clause, but only with the <B>LIKE</B> predicate. (This is the same as the SQL_LIKE_ONLY value in ODBC 2.<I>x</I>.)</P>
+#
+# <P>SQL_PRED_BASIC if the column can be used in a <B>WHERE</B> clause with all the comparison operators except <B>LIKE</B> (comparison, quantified comparison, <B>BETWEEN</B>, <B>DISTINCT</B>, <B>IN</B>, <B>MATCH</B>, and <B>UNIQUE</B>). (This is the same as the SQL_ALL_EXCEPT_LIKE value in ODBC 2.<I>x</I>.)</P>
+#
+# <P>SQL_SEARCHABLE if the column can be used in a <B>WHERE</B> clause with any comparison operator.</P>
+# </TD>
+# </TR>
+ { name => "searchable",
+ type => "smallint",
+ length => undef,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>UNSIGNED_ATTRIBUTE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>10</TD>
+# <TD width=15%>Smallint</TD>
+# <TD width=38%>Whether the data type is unsigned:
+# <P>SQL_TRUE if the data type is unsigned.</P>
+#
+# <P>SQL_FALSE if the data type is signed.</P>
+#
+# <P>NULL is returned if the attribute is not applicable to the data type or the data type is not numeric.</P>
+# </TD>
+# </TR>
+ { name => "unsigned_attribute",
+ type => "smallint",
+ length => undef,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>FIXED_PREC_SCALE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>11</TD>
+# <TD width=15%>Smallint<BR>
+# not NULL</TD>
+# <TD width=38%>Whether the data type has predefined fixed precision and scale (which are data source&#0150;specific), such as a money data type:
+# <P>SQL_TRUE if it has predefined fixed precision and scale.</P>
+#
+# <P>SQL_FALSE if it does not have predefined fixed precision and scale.</P>
+# </TD>
+# </TR>
+ { name => "fixed_prec_scale",
+ type => "smallint",
+ length => undef,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>AUTO_UNIQUE_VALUE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>12</TD>
+# <TD width=15%>Smallint</TD>
+# <TD width=38%>Whether the data type is autoincrementing:
+# <P>SQL_TRUE if the data type is autoincrementing.</P>
+#
+# <P>SQL_FALSE if the data type is not autoincrementing.</P>
+#
+# <P>NULL is returned if the attribute is not applicable to the data type or the data type is not numeric.</P>
+#
+# <P>An application can insert values into a column having this attribute, but typically cannot update the values in the column. </P>
+#
+# <P>When an insert is made into an auto-increment column, a unique value is inserted into the column at insert time. The increment is not defined, but is data source&#0150;specific. An application should not assume that an auto-increment column starts at any particular point or increments by any particular value.</P>
+# </TD>
+# </TR>
+ { name => "auto_unique_value",
+ type => "smallint",
+ length => undef,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>LOCAL_TYPE_NAME<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>13</TD>
+# <TD width=15%>Varchar</TD>
+# <TD width=38%>Localized version of the data source&#0150;dependent name of the data type. NULL is returned if a localized name is not supported by the data source. This name is intended for display only, such as in dialog boxes.</TD>
+# </TR>
+ { name => "local_type_name",
+ type => "varchar",
+ length => 20,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>MINIMUM_SCALE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>14</TD>
+# <TD width=15%>Smallint</TD>
+# <TD width=38%>The minimum scale of the data type on the data source. If a data type has a fixed scale, the MINIMUM_SCALE and MAXIMUM_SCALE columns both contain this value. For example, an SQL_TYPE_TIMESTAMP column might have a fixed scale for fractional seconds. NULL is returned where scale is not applicable. For more information, see "<A HREF="odbccolumn_size__decimal_digits__transfer_octet_length__and_display_size.htm">Column Size, Decimal Digits, Transfer Octet Length, and Display Size</A>" in Appendix D: Data Types.</TD>
+# </TR>
+ { name => "minimum_scale",
+ type => "smallint",
+ length => undef,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>MAXIMUM_SCALE<BR>
+# (ODBC 2.0)</TD>
+# <TD width=14%>15</TD>
+# <TD width=15%>Smallint</TD>
+# <TD width=38%>The maximum scale of the data type on the data source. NULL is returned where scale is not applicable. If the maximum scale is not defined separately on the data source, but is instead defined to be the same as the maximum precision, this column contains the same value as the COLUMN_SIZE column. For more information, see "<A HREF="odbccolumn_size__decimal_digits__transfer_octet_length__and_display_size.htm">Column Size, Decimal Digits, Transfer Octet Length, and Display Size</A>" in Appendix D: Data Types.</TD>
+# </TR>
+ { name => "maximum_scale",
+ type => "smallint",
+ length => undef,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>SQL_DATA_TYPE<BR>
+# (ODBC 3.0)</TD>
+# <TD width=14%>16</TD>
+# <TD width=15%>Smallint NOT NULL</TD>
+# <TD width=38%>The value of the SQL data type as it appears in the SQL_DESC_TYPE field of the descriptor. This column is the same as the DATA_TYPE column, except for interval and datetime data types.
+# <P>For interval and datetime data types, the SQL_DATA_TYPE field in the result set will return SQL_INTERVAL or SQL_DATETIME, and the SQL_DATETIME_SUB field will return the subcode for the specific interval or datetime data type. (See <A HREF="odbcdata_types.htm">Appendix D: Data Types</A>.) </P>
+# </TD>
+# </TR>
+ { name => "sql_data_type",
+ type => "smallint",
+ length => undef,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>SQL_DATETIME_SUB<BR>
+# (ODBC 3.0)</TD>
+# <TD width=14%>17</TD>
+# <TD width=15%>Smallint</TD>
+# <TD width=38%>When the value of SQL_DATA_TYPE is SQL_DATETIME or SQL_INTERVAL, this column contains the datetime/interval subcode. For data types other than datetime and interval, this field is NULL.
+# <P>For interval or datetime data types, the SQL_DATA_TYPE field in the result set will return SQL_INTERVAL or SQL_DATETIME, and the SQL_DATETIME_SUB field will return the subcode for the specific interval or datetime data type. (See <A HREF="odbcdata_types.htm">Appendix D: Data Types</A>.)</P>
+# </TD>
+# </TR>
+ { name => "sql_datetime_sub",
+ type => "smallint",
+ length => undef,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>NUM_PREC_RADIX<BR>
+# (ODBC 3.0)</TD>
+# <TD width=14%>18</TD>
+# <TD width=15%>Integer</TD>
+# <TD width=38%>If the data type is an approximate numeric type, this column contains the value 2 to indicate that COLUMN_SIZE specifies a number of bits. For exact numeric types, this column contains the value 10 to indicate that COLUMN_SIZE specifies a number of decimal digits. Otherwise, this column is NULL.</TD>
+# </TR>
+ { name => "num_prec_radix",
+ type => "integer",
+ length => undef,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=33%>INTERVAL_PRECISION<BR>
+# (ODBC 3.0)</TD>
+# <TD width=14%>19</TD>
+# <TD width=15%>Smallint</TD>
+# <TD width=38%>If the data type is an interval data type, then this column contains the value of the interval leading precision. (See "<A HREF="odbcinterval_data_type_precision.htm">Interval Data Type Precision</A>" in Appendix D: Data Types.) Otherwise, this column is NULL.</TD>
+# </TR>
+ { name => "interval_precision",
+ type => "smallint",
+ length => undef,
+ nullable => 1,
+ },
+# </table></div>
+# <!--TS:-->
+# <P>Attribute information can apply to data types or to specific columns in a result set. <B>SQLGetTypeInfo</B> returns information about attributes associated with data types; <B>SQLColAttribute</B> returns information about attributes associated with columns in a result set.</P>
+#
+# <P class="label"><B>Related Functions</B></P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=50%>For information about</TH>
+# <TH width=50%>See</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Binding a buffer to a column in a result set</TD>
+# <TD width=50%><A HREF="odbcsqlbindcol.htm">SQLBindCol</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Canceling statement processing</TD>
+# <TD width=50%><A HREF="odbcsqlcancel.htm">SQLCancel</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Returning information about a column in a result set</TD>
+# <TD width=50%><A HREF="odbcsqlcolattribute.htm">SQLColAttribute</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Fetching a block of data or scrolling through a result set</TD>
+# <TD width=50%><A HREF="odbcsqlfetchscroll.htm">SQLFetchScroll</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Fetching a single row or a block of data in a forward-only direction</TD>
+# <TD width=50%><A HREF="odbcsqlfetch.htm">SQLFetch</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Returning information about a driver or data source</TD>
+# <TD width=50%><A HREF="odbcsqlgetinfo.htm">SQLGetInfo</A></TD>
+# </TR>
+# </table></div>
+# <!--TS:--><H4><A NAME="feedback"></A></H4>
+# <SPAN id="SDKFeedB"></SPAN>
+# </div>
+#
+# </BODY>
+# </HTML>
+];
+
+#
+# odbcsqltables.htm
+#
+$listWhat->{tables} = [
+# <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+# <HTML DIR="LTR"><HEAD>
+# <META HTTP-EQUIV="Content-Type" Content="text/html; charset=Windows-1252">
+# <TITLE>SQLTables</TITLE>
+# <SCRIPT SRC="/stylesheets/vs70link.js"></SCRIPT>
+# <SCRIPT SRC="/stylesheets/vs70.js"></SCRIPT>
+# <SCRIPT LANGUAGE="JScript" SRC="/stylesheets/odbc.js"></SCRIPT>
+# </HEAD>
+# <body topmargin=0 id="bodyID">
+#
+# <div id="nsbanner">
+# <div id="bannertitle">
+# <TABLE CLASS="bannerparthead" CELLSPACING=0>
+# <TR ID="hdr">
+# <TD CLASS="bannertitle" nowrap>
+# ODBC Programmer's Reference
+# </TD><TD valign=middle><a href="#Feedback"><IMG name="feedb" onclick=EMailStream(SDKFeedB) style="CURSOR: hand;" hspace=15 alt="" src="/stylesheets/mailto.gif" align=right></a></TD>
+# </TR>
+# </TABLE>
+# </div>
+# </div>
+# <DIV id="nstext" valign="bottom">
+#
+# <H1><A NAME="odbcsqltables"></A>SQLTables</H1>
+#
+# <P class="label"><B>Conformance</B></P>
+#
+# <P>Version Introduced: ODBC 1.0<BR>
+# Standards Compliance: X/Open</P>
+#
+# <P class="label"><B>Summary</B></P>
+#
+# <P><B>SQLTables</B> returns the list of table, catalog, or schema names, and table types, stored in a specific data source. The driver returns the information as a result set.</P>
+#
+# <P class="label"><B>Syntax</B></P>
+#
+# <PRE class="syntax">SQLRETURN <B>SQLTables</B>(
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLHSTMT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>StatementHandle</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLCHAR *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>CatalogName</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLSMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>NameLength1</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLCHAR *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>SchemaName</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLSMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>NameLength2</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLCHAR *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>TableName</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLSMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>NameLength3</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLCHAR *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>TableType</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLSMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>NameLength4</I>);</PRE>
+#
+# <P class="label"><B>Arguments</B>
+#
+# <DL>
+# <DT><I>StatementHandle</I></DT>
+#
+# <DD>[Input]<BR>
+# Statement handle for retrieved results.</dd>
+#
+# <DT><I>CatalogName</I></DT>
+#
+# <DD>[Input]<BR>
+# Catalog name. The <I>CatalogName</I> argument accepts search patterns if the SQL_ODBC_VERSION environment attribute is SQL_OV_ODBC3; it does not accept search patterns if SQL_OV_ODBC2 is set. If a driver supports catalogs for some tables but not for others, such as when a driver retrieves data from different DBMSs, an empty string ("") denotes those tables that do not have catalogs.
+#
+# <P>If the SQL_ATTR_METADATA_ID statement attribute is set to SQL_TRUE, <I>CatalogName</I> is treated as an identifier and its case is not significant. If it is SQL_FALSE, <I>CatalogName</I> is a pattern value argument; it is treated literally, and its case is significant. For more information, see "<A HREF="odbcarguments_in_catalog_functions.htm">Arguments in Catalog Functions</A>" in Chapter 7: Catalog Functions.
+# </dd>
+#
+# <DT><I>NameLength1</I></DT>
+#
+# <DD>[Input]<BR>
+# Length of *<I>CatalogName</I>.</dd>
+#
+# <DT><I>SchemaName</I></DT>
+#
+# <DD>[Input]<BR>
+# String search pattern for schema names. If a driver supports schemas for some tables but not for others, such as when the driver retrieves data from different DBMSs, an empty string ("") denotes those tables that do not have schemas.
+#
+# <P>If the SQL_ATTR_METADATA_ID statement attribute is set to SQL_TRUE, <I>SchemaName</I> is treated as an identifier and its case is not significant. If it is SQL_FALSE, <I>SchemaName</I> is a pattern value argument; it is treated literally, and its case is significant.
+# </dd>
+#
+# <DT><I>NameLength2</I></DT>
+#
+# <DD>[Input]<BR>
+# Length of *<I>SchemaName</I>.</dd>
+#
+# <DT><I>TableName</I></DT>
+#
+# <DD>[Input]<BR>
+# String search pattern for table names.
+#
+# <P>If the SQL_ATTR_METADATA_ID statement attribute is set to SQL_TRUE, <I>TableName</I> is treated as an identifier and its case is not significant. If it is SQL_FALSE, <I>TableName</I> is a pattern value argument; it is treated literally, and its case is significant.
+# </dd>
+#
+# <DT><I>NameLength3</I></DT>
+#
+# <DD>[Input]<BR>
+# Length of *<I>TableName</I>.</dd>
+#
+# <DT><I>TableType</I></DT>
+#
+# <DD>[Input]<BR>
+# List of table types to match.
+#
+# <P>Note that the SQL_ATTR_METADATA_ID statement attribute has no effect upon the <I>TableType</I> argument. <I>TableType</I> is a value list argument, no matter what the setting of SQL_ATTR_METADATA_ID.
+# </dd>
+#
+# <DT><I>NameLength4</I></DT>
+#
+# <DD>[Input]<BR>
+# Length of *<I>TableType</I>.</dd>
+# </DL>
+#
+# <P class="label"><B>Returns</B></P>
+#
+# <P>SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR, or SQL_INVALID_HANDLE.</P>
+#
+# <P class="label"><B>Diagnostics</B></P>
+#
+# <P>When <B>SQLTables</B> returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value may be obtained by calling <B>SQLGetDiagRec</B> with a <I>HandleType</I> of SQL_HANDLE_STMT and a <I>Handle</I> of <I>StatementHandle</I>. The following table lists the SQLSTATE values commonly returned by <B>SQLTables</B> and explains each one in the context of this function; the notation "(DM)" precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=22%>SQLSTATE</TH>
+# <TH width=26%>Error</TH>
+# <TH width=52%>Description</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>01000</TD>
+# <TD width=26%>General warning</TD>
+# <TD width=52%>Driver-specific informational message. (Function returns SQL_SUCCESS_WITH_INFO.)</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>08S01</TD>
+# <TD width=26%>Communication link failure</TD>
+# <TD width=52%>The communication link between the driver and the data source to which the driver was connected failed before the function completed processing.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>24000</TD>
+# <TD width=26%>Invalid cursor state</TD>
+# <TD width=52%>A cursor was open on the <I>StatementHandle</I>, and <B>SQLFetch</B> or <B>SQLFetchScroll</B> had been called. This error is returned by the Driver Manager if <B>SQLFetch</B> or <B>SQLFetchScroll</B> has not returned SQL_NO_DATA and is returned by the driver if <B>SQLFetch</B> or <B>SQLFetchScroll</B> has returned SQL_NO_DATA.
+# <P>A cursor was open on the <I>StatementHandle</I>, but <B>SQLFetch</B> or <B>SQLFetchScroll</B> had not been called.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>40001</TD>
+# <TD width=26%>Serialization failure</TD>
+# <TD width=52%>The transaction was rolled back due to a resource deadlock with another transaction.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>40003</TD>
+# <TD width=26%>Statement completion unknown</TD>
+# <TD width=52%>The associated connection failed during the execution of this function, and the state of the transaction cannot be determined.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY000</TD>
+# <TD width=26%>General error</TD>
+# <TD width=52%>An error occurred for which there was no specific SQLSTATE and for which no implementation-specific SQLSTATE was defined. The error message returned by <B>SQLGetDiagRec</B> in the <I>*MessageText</I> buffer describes the error and its cause.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY001</TD>
+# <TD width=26%>Memory allocation <BR>
+# error</TD>
+# <TD width=52%>The driver was unable to allocate memory required to support execution or completion of the function.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY008</TD>
+# <TD width=26%>Operation canceled</TD>
+# <TD width=52%>Asynchronous processing was enabled for the <I>StatementHandle</I>. The function was called, and before it completed execution, <B>SQLCancel</B> was called on the <I>StatementHandle</I>. Then the function was called again on the <I>StatementHandle</I>.
+# <P>The function was called, and before it completed execution, <B>SQLCancel</B> was called on the <I>StatementHandle</I> from a different thread in a multithread application.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY009</TD>
+# <TD width=26%>Invalid use of null pointer</TD>
+# <TD width=52%>The SQL_ATTR_METADATA_ID statement attribute was set to SQL_TRUE, the <I>CatalogName</I> argument was a null pointer, and the SQL_CATALOG_NAME <I>InfoType</I> returns that catalog names are supported.
+# <P>(DM) The SQL_ATTR_METADATA_ID statement attribute was set to SQL_TRUE, and the <I>SchemaName</I> or <I>TableName</I> argument was a null pointer.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY010</TD>
+# <TD width=26%>Function sequence error</TD>
+# <TD width=52%>(DM) An asynchronously executing function (not this one) was called for the <I>StatementHandle</I> and was still executing when this function was called.
+# <P>(DM) <B>SQLExecute</B>, <B>SQLExecDirect</B>, <B>SQLBulkOperations</B>, or <B>SQLSetPos</B> was called for the <I>StatementHandle</I> and returned SQL_NEED_DATA. This function was called before data was sent for all data-at-execution parameters or columns.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY013</TD>
+# <TD width=26%>Memory management error</TD>
+# <TD width=52%>The function call could not be processed because the underlying memory objects could not be accessed, possibly because of low memory conditions.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY090</TD>
+# <TD width=26%>Invalid string or buffer length</TD>
+# <TD width=52%>(DM) The value of one of the length arguments was less than 0 but not equal to SQL_NTS.
+# <P>The value of one of the name length arguments exceeded the maximum length value for the corresponding name.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYC00</TD>
+# <TD width=26%>Optional feature not implemented</TD>
+# <TD width=52%>A catalog was specified, and the driver or data source does not support catalogs.
+# <P>A schema was specified, and the driver or data source does not support schemas.</P>
+#
+# <P>A string search pattern was specified for the catalog name, table schema, or table name, and the data source does not support search patterns for one or more of those arguments.</P>
+#
+# <P>The combination of the current settings of the SQL_ATTR_CONCURRENCY and SQL_ATTR_CURSOR_TYPE statement attributes was not supported by the driver or data source. </P>
+#
+# <P>The SQL_ATTR_USE_BOOKMARKS statement attribute was set to SQL_UB_VARIABLE, and the SQL_ATTR_CURSOR_TYPE statement attribute was set to a cursor type for which the driver does not support bookmarks.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYT00</TD>
+# <TD width=26%>Timeout expired</TD>
+# <TD width=52%>The query timeout period expired before the data source returned the requested result set. The timeout period is set through <B>SQLSetStmtAttr</B>, SQL_ATTR_QUERY_TIMEOUT.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYT01</TD>
+# <TD width=26%>Connection timeout expired</TD>
+# <TD width=52%>The connection timeout period expired before the data source responded to the request. The connection timeout period is set through <B>SQLSetConnectAttr</B>, SQL_ATTR_CONNECTION_TIMEOUT.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>IM001</TD>
+# <TD width=26%>Driver does not support this function</TD>
+# <TD width=52%>(DM) The driver associated with the <I>StatementHandle</I> does not support the function.</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Comments</B></P>
+#
+# <P><B>SQLTables</B> lists all tables in the requested range. A user may or may not have SELECT privileges to any of these tables. To check accessibility, an application can:
+#
+# <UL type=disc>
+# <LI>Call <B>SQLGetInfo</B> and check the SQL_ACCESSIBLE_TABLES information type.</li>
+#
+# <LI>Call <B>SQLTablePrivileges</B> to check the privileges for each table.</li>
+# </UL>
+#
+# <P>Otherwise, the application must be able to handle a situation where the user selects a table for which <B>SELECT</B> privileges are not granted.</P>
+#
+# <P>The <I>SchemaName</I> and <I>TableName</I> arguments accept search patterns. The <I>CatalogName</I> argument accepts search patterns if the SQL_ODBC_VERSION environment attribute is SQL_OV_ODBC3; it does not accept search patterns if SQL_OV_ODBC2 is set. If SQL_OV_ODBC3 is set, an ODBC 3<I>.x</I> driver will require that wildcard characters in the <I>CatalogName</I> argument be escaped to be treated literally. For more information about valid search patterns, see "<A HREF="odbcpattern_value_arguments.htm">Pattern Value Arguments</A>" in Chapter 7: Catalog Functions.</P>
+#
+# <P class="indent"><b class="le">Note</b>&nbsp;&nbsp;&nbsp;For more information about the general use, arguments, and returned data of ODBC catalog functions, see <A HREF="odbccatalog_functions.htm">Chapter 7: Catalog Functions</A>.</P>
+#
+# <P>To support enumeration of catalogs, schemas, and table types, the following special semantics are defined for the <I>CatalogName</I>, <I>SchemaName</I>, <I>TableName</I>, and <I>TableType</I> arguments of <B>SQLTables</B>:
+#
+# <UL type=disc>
+# <LI>If <I>CatalogName</I> is SQL_ALL_CATALOGS and <I>SchemaName</I> and <I>TableName</I> are empty strings, the result set contains a list of valid catalogs for the data source. (All columns except the TABLE_CAT column contain NULLs.)</li>
+#
+# <LI>If <I>SchemaName</I> is SQL_ALL_SCHEMAS and <I>CatalogName</I> and <I>TableName</I> are empty strings, the result set contains a list of valid schemas for the data source. (All columns except the TABLE_SCHEM column contain NULLs.)</li>
+#
+# <LI>If <I>TableType</I> is SQL_ALL_TABLE_TYPES and <I>CatalogName</I>, <I>SchemaName</I>, and <I>TableName</I> are empty strings, the result set contains a list of valid table types for the data source. (All columns except the TABLE_TYPE column contain NULLs.)</li>
+# </UL>
+#
+# <P>If <I>TableType</I> is not an empty string, it must contain a list of comma-separated values for the types of interest; each value may be enclosed in single quotation marks (') or unquoted&#0151;for example, 'TABLE', 'VIEW' or TABLE, VIEW. An application should always specify the table type in uppercase; the driver should convert the table type to whatever case is needed by the data source. If the data source does not support a specified table type, <B>SQLTables</B> does not return any results for that type.</P>
+#
+# <P><B>SQLTables</B> returns the results as a standard result set, ordered by TABLE_TYPE, TABLE_CAT, TABLE_SCHEM, and TABLE_NAME. For information about how this information might be used, see "<A HREF="odbcuses_of_catalog_data.htm">Uses of Catalog Data</A>" in Chapter 7: Catalog Functions.</P>
+#
+# <P>To determine the actual lengths of the TABLE_CAT, TABLE_SCHEM, and TABLE_NAME columns, an application can call <B>SQLGetInfo</B> with the SQL_MAX_CATALOG_NAME_LEN, SQL_MAX_SCHEMA_NAME_LEN, and SQL_MAX_TABLE_NAME_LEN information types.</P>
+#
+# <P>The following columns have been renamed for ODBC 3<I>.x</I>. The column name changes do not affect backward compatibility because applications bind by column number.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=48%>ODBC 2.0 column</TH>
+# <TH width=52%>ODBC 3<I>.x</I> column</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>TABLE_QUALIFIER</TD>
+# <TD width=52%>TABLE_CAT</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>TABLE_OWNER</TD>
+# <TD width=52%>TABLE_SCHEM</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P>The following table lists the columns in the result set. Additional columns beyond column 5 (REMARKS) can be defined by the driver. An application should gain access to driver-specific columns by counting down from the end of the result set rather than specifying an explicit ordinal position. For more information, see "<A HREF="odbcdata_returned_by_catalog_functions.htm">Data Returned by Catalog Functions</A>" in Chapter 7: Catalog Functions.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=27%><BR>
+# Column name</TH>
+# <TH width=15%>Column number</TH>
+# <TH width=16%><BR>
+# Data type</TH>
+# <TH width=42%><BR>
+# Comments</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>TABLE_CAT<BR>
+# (ODBC 1.0)</TD>
+# <TD width=15%>1</TD>
+# <TD width=16%>Varchar</TD>
+# <TD width=42%>Catalog name; NULL if not applicable to the data source. If a driver supports catalogs for some tables but not for others, such as when the driver retrieves data from different DBMSs, it returns an empty string ("") for those tables that do not have catalogs.</TD>
+# </TR>
+ { name => "table_cat",
+ type => "varchar",
+ length => 16,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=27%>TABLE_SCHEM<BR>
+# (ODBC 1.0)</TD>
+# <TD width=15%>2</TD>
+# <TD width=16%>Varchar</TD>
+# <TD width=42%>Schema name; NULL if not applicable to the data source. If a driver supports schemas for some tables but not for others, such as when the driver retrieves data from different DBMSs, it returns an empty string ("") for those tables that do not have schemas.</TD>
+# </TR>
+ { name => "table_schem",
+ type => "varchar",
+ length => 16,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=27%>TABLE_NAME<BR>
+# (ODBC 1.0)</TD>
+# <TD width=15%>3</TD>
+# <TD width=16%>Varchar</TD>
+# <TD width=42%>Table name.</TD>
+# </TR>
+ { name => "table_name",
+ type => "varchar",
+ length => 16,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=27%>TABLE_TYPE<BR>
+# (ODBC 1.0)</TD>
+# <TD width=15%>4</TD>
+# <TD width=16%>Varchar</TD>
+# <TD width=42%>Table type name; one of the following: "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM", or a data source&#0150;specific type name.
+# <P>The meanings of "ALIAS" and "SYNONYM" are driver-specific.</P>
+# </TD>
+# </TR>
+ { name => "table_type",
+ type => "varchar",
+ length => 20,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=27%>REMARKS<BR>
+# (ODBC 1.0)</TD>
+# <TD width=15%>5</TD>
+# <TD width=16%>Varchar</TD>
+# <TD width=42%>A description of the table.</TD>
+# </TR>
+ { name => "remarks",
+ type => "varchar",
+ length => 200,
+ nullable => 1,
+ },
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Code Example</B></P>
+#
+# <P>For a code example of a similar function, see <A HREF="odbcsqlcolumns.htm">SQLColumns</A>.</P>
+#
+# <P class="label"><B>Related Functions</B></P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=43%>For information about</TH>
+# <TH width=57%>See</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>Binding a buffer to a column in a result set</TD>
+# <TD width=57%><A HREF="odbcsqlbindcol.htm">SQLBindCol</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>Canceling statement processing</TD>
+# <TD width=57%><A HREF="odbcsqlcancel.htm">SQLCancel</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>Returning privileges for a column or columns</TD>
+# <TD width=57%><A HREF="odbcsqlcolumnprivileges.htm">SQLColumnPrivileges</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>Returning the columns in a table or tables</TD>
+# <TD width=57%><A HREF="odbcsqlcolumns.htm">SQLColumns</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>Fetching a single row or a block of data in a forward-only direction</TD>
+# <TD width=57%><A HREF="odbcsqlfetch.htm">SQLFetch</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>Fetching a block of data or scrolling through a result set</TD>
+# <TD width=57%><A HREF="odbcsqlfetchscroll.htm">SQLFetchScroll</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>Returning table statistics and indexes</TD>
+# <TD width=57%><A HREF="odbcsqlstatistics.htm">SQLStatistics</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=43%>Returning privileges for a table or tables</TD>
+# <TD width=57%><A HREF="odbcsqltableprivileges.htm">SQLTablePrivileges</A></TD>
+# </TR>
+# </table></div>
+# <!--TS:--><H4><A NAME="feedback"></A></H4>
+# <SPAN id="SDKFeedB"></SPAN>
+# </div>
+#
+# </BODY>
+# </HTML>
+];
+
+#
+# odbcsqlcolumns.htm
+#
+$listWhat->{columns} = [
+# <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+# <HTML DIR="LTR"><HEAD>
+# <META HTTP-EQUIV="Content-Type" Content="text/html; charset=Windows-1252">
+# <TITLE>SQLColumns</TITLE>
+# <SCRIPT SRC="/stylesheets/vs70link.js"></SCRIPT>
+# <SCRIPT SRC="/stylesheets/vs70.js"></SCRIPT>
+# <SCRIPT LANGUAGE="JScript" SRC="/stylesheets/odbc.js"></SCRIPT>
+# </HEAD>
+# <body topmargin=0 id="bodyID">
+#
+# <div id="nsbanner">
+# <div id="bannertitle">
+# <TABLE CLASS="bannerparthead" CELLSPACING=0>
+# <TR ID="hdr">
+# <TD CLASS="bannertitle" nowrap>
+# ODBC Programmer's Reference
+# </TD><TD valign=middle><a href="#Feedback"><IMG name="feedb" onclick=EMailStream(SDKFeedB) style="CURSOR: hand;" hspace=15 alt="" src="/stylesheets/mailto.gif" align=right></a></TD>
+# </TR>
+# </TABLE>
+# </div>
+# </div>
+# <DIV id="nstext" valign="bottom">
+#
+# <H1><A NAME="odbcsqlcolumns"></A>SQLColumns</H1>
+#
+# <P class="label"><B>Conformance</B></P>
+#
+# <P>Version Introduced: ODBC 1.0<BR>
+# Standards Compliance: X/Open</P>
+#
+# <P class="label"><B>Summary</B></P>
+#
+# <P><B>SQLColumns</B> returns the list of column names in specified tables. The driver returns this information as a result set on the specified <I>StatementHandle</I>.</P>
+#
+# <P class="label"><B>Syntax</B></P>
+#
+# <PRE class="syntax">SQLRETURN <B>SQLColumns</B>(
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLHSTMT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>StatementHandle</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLCHAR *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>CatalogName</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLSMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>NameLength1</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLCHAR *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>SchemaName</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLSMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>NameLength2</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLCHAR *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>TableName</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLSMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>NameLength3</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLCHAR *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>ColumnName</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLSMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>NameLength4</I>);</PRE>
+#
+# <P class="label"><B>Arguments</B>
+#
+# <DL>
+# <DT><I>StatementHandle</I></DT>
+#
+# <DD>[Input]<BR>
+# Statement handle.</dd>
+#
+# <DT><I>CatalogName</I></DT>
+#
+# <DD>[Input]<BR>
+# Catalog name. If a driver supports catalogs for some tables but not for others, such as when the driver retrieves data from different DBMSs, an empty string ("") denotes those tables that do not have catalogs. <I>CatalogName</I> cannot contain a string search pattern.</dd>
+# </DL>
+#
+# <BLOCKQUOTE>
+# If the SQL_ATTR_METADATA_ID statement attribute is set to SQL_TRUE, <I>CatalogName</I> is treated as an identifier and its case is not significant. If it is SQL_FALSE, <I>CatalogName</I> is an ordinary argument; it is treated literally, and its case is significant. For more information, see "<A HREF="odbcarguments_in_catalog_functions.htm">Arguments in Catalog Functions</A>" in Chapter 7: Catalog Functions.</BLOCKQUOTE>
+#
+# <DL>
+# <DT><I>NameLength1</I></DT>
+#
+# <DD>[Input]<BR>
+# Length of *<I>CatalogName</I>.</dd>
+#
+# <DT><I>SchemaName</I></DT>
+#
+# <DD>[Input]<BR>
+# String search pattern for schema names. If a driver supports schemas for some tables but not for others, such as when the driver retrieves data from different DBMSs, an empty string ("") denotes those tables that do not have schemas.</dd>
+# </DL>
+#
+# <BLOCKQUOTE>
+# If the SQL_ATTR_METADATA_ID statement attribute is set to SQL_TRUE, <I>SchemaName</I> is treated as an identifier and its case is not significant. If it is SQL_FALSE, <I>SchemaName</I> is a pattern value argument; it is treated literally, and its case is significant.</BLOCKQUOTE>
+#
+# <DL>
+# <DT><I>NameLength2</I></DT>
+#
+# <DD>[Input]<BR>
+# Length of *<I>SchemaName</I>.</dd>
+#
+# <DT><I>TableName</I></DT>
+#
+# <DD>[Input]<BR>
+# String search pattern for table names.</dd>
+# </DL>
+#
+# <BLOCKQUOTE>
+# If the SQL_ATTR_METADATA_ID statement attribute is set to SQL_TRUE, <I>TableName</I> is treated as an identifier and its case is not significant. If it is SQL_FALSE, <I>TableName</I> is a pattern value argument; it is treated literally, and its case is significant.</BLOCKQUOTE>
+#
+# <DL>
+# <DT><I>NameLength3</I></DT>
+#
+# <DD>[Input]<BR>
+# Length of *<I>TableName</I>.</dd>
+#
+# <DT><I>ColumnName</I></DT>
+#
+# <DD>[Input]<BR>
+# String search pattern for column names. </dd>
+# </DL>
+#
+# <BLOCKQUOTE>
+# If the SQL_ATTR_METADATA_ID statement attribute is set to SQL_TRUE, <I>ColumnName</I> is treated as an identifier and its case is not significant. If it is SQL_FALSE, <I>ColumnName</I> is a pattern value argument; it is treated literally, and its case is significant.</BLOCKQUOTE>
+#
+# <DL>
+# <DT><I>NameLength4</I></DT>
+#
+# <DD>[Input]<BR>
+# Length of *<I>ColumnName</I>.</dd>
+# </DL>
+#
+# <P class="label"><B>Returns</B></P>
+#
+# <P>SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR, or SQL_INVALID_HANDLE.</P>
+#
+# <P class="label"><B>Diagnostics</B></P>
+#
+# <P>When <B>SQLColumns</B> returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value may be obtained by calling <B>SQLGetDiagRec</B> with a <I>HandleType</I> of SQL_HANDLE_STMT and a <I>Handle</I> of <I>StatementHandle</I>. The following table lists the SQLSTATE values commonly returned by <B>SQLColumns</B> and explains each one in the context of this function; the notation "(DM)" precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=22%>SQLSTATE</TH>
+# <TH width=26%>Error</TH>
+# <TH width=52%>Description</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>01000</TD>
+# <TD width=26%>General warning</TD>
+# <TD width=52%>Driver-specific informational message. (Function returns SQL_SUCCESS_WITH_INFO.)</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>08S01</TD>
+# <TD width=26%>Communication link failure</TD>
+# <TD width=52%>The communication link between the driver and the data source to which the driver was connected failed before the function completed processing.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>24000</TD>
+# <TD width=26%>Invalid cursor state</TD>
+# <TD width=52%>A cursor was open on the <I>StatementHandle</I>, and <B>SQLFetch</B> or <B>SQLFetchScroll</B> had been called. This error is returned by the Driver Manager if <B>SQLFetch</B> or <B>SQLFetchScroll</B> has not returned SQL_NO_DATA, and is returned by the driver if <B>SQLFetch</B> or <B>SQLFetchScroll</B> has returned SQL_NO_DATA.
+# <P>A cursor was open on the <I>StatementHandle</I> but <B>SQLFetch</B> or <B>SQLFetchScroll</B> had not been called.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>40001</TD>
+# <TD width=26%>Serialization failure</TD>
+# <TD width=52%>The transaction was rolled back due to a resource deadlock with another transaction.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>40003</TD>
+# <TD width=26%>Statement completion unknown</TD>
+# <TD width=52%>The associated connection failed during the execution of this function, and the state of the transaction cannot be determined.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY000</TD>
+# <TD width=26%>General error</TD>
+# <TD width=52%>An error occurred for which there was no specific SQLSTATE and for which no implementation-specific SQLSTATE was defined. The error message returned by <B>SQLGetDiagRec</B> in the <I>*MessageText</I> buffer describes the error and its cause.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY001</TD>
+# <TD width=26%>Memory allocation error</TD>
+# <TD width=52%>The driver was unable to allocate memory required to support execution or completion of the function.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY008</TD>
+# <TD width=26%>Operation canceled</TD>
+# <TD width=52%>Asynchronous processing was enabled for the <I>StatementHandle</I>. The function was called, and before it completed execution, <B>SQLCancel</B> was called on the <I>StatementHandle</I>. Then the function was called again on the <I>StatementHandle</I>.
+# <P>The function was called, and before it completed execution, <B>SQLCancel</B> was called on the <I>StatementHandle</I> from a different thread in a multithread application.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY009</TD>
+# <TD width=26%>Invalid use of null pointer</TD>
+# <TD width=52%>The SQL_ATTR_METADATA_ID statement attribute was set to SQL_TRUE, the <I>CatalogName</I> argument was a null pointer, and the SQL_CATALOG_NAME <I>InfoType</I> returns that catalog names are supported.
+# <P>(DM) The SQL_ATTR_METADATA_ID statement attribute was set to SQL_TRUE, and the <I>SchemaName</I>, <I>TableName</I>, or <I>ColumnName</I> argument was a null pointer.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY010</TD>
+# <TD width=26%>Function sequence error</TD>
+# <TD width=52%>(DM) An asynchronously executing function (not this one) was called for the <I>StatementHandle</I> and was still executing when this function was called.
+# <P>(DM) <B>SQLExecute</B>, <B>SQLExecDirect</B>, <B>SQLBulkOperations</B>, or <B>SQLSetPos</B> was called for the <I>StatementHandle</I> and returned SQL_NEED_DATA. This function was called before data was sent for all data-at-execution parameters or columns.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY013</TD>
+# <TD width=26%>Memory management error</TD>
+# <TD width=52%>The function call could not be processed because the underlying memory objects could not be accessed, possibly because of low memory conditions.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY090</TD>
+# <TD width=26%>Invalid string or buffer length</TD>
+# <TD width=52%>(DM) The value of one of the name length arguments was less than 0 but not equal to SQL_NTS.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>&nbsp;</TD>
+# <TD width=26%>&nbsp;</TD>
+# <TD width=52%>The value of one of the name length arguments exceeded the maximum length value for the corresponding catalog or name. The maximum length of each catalog or name may be obtained by calling <B>SQLGetInfo</B> with the <I>InfoType</I> values. (See "Comments.")</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYC00</TD>
+# <TD width=26%>Optional feature not implemented</TD>
+# <TD width=52%>A catalog name was specified, and the driver or data source does not support catalogs.
+# <P>A schema name was specified, and the driver or data source does not support schemas.</P>
+#
+# <P>A string search pattern was specified for the schema name, table name, or column name, and the data source does not support search patterns for one or more of those arguments.</P>
+#
+# <P>The combination of the current settings of the SQL_ATTR_CONCURRENCY and SQL_ATTR_CURSOR_TYPE statement attributes was not supported by the driver or data source. </P>
+#
+# <P>The SQL_ATTR_USE_BOOKMARKS statement attribute was set to SQL_UB_VARIABLE, and the SQL_ATTR_CURSOR_TYPE statement attribute was set to a cursor type for which the driver does not support bookmarks.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYT00</TD>
+# <TD width=26%>Timeout expired</TD>
+# <TD width=52%>The query timeout period expired before the data source returned the result set. The timeout period is set through <B>SQLSetStmtAttr</B>, SQL_ATTR_QUERY_TIMEOUT.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYT01</TD>
+# <TD width=26%>Connection timeout expired</TD>
+# <TD width=52%>The connection timeout period expired before the data source responded to the request. The connection timeout period is set through <B>SQLSetConnectAttr</B>, SQL_ATTR_CONNECTION_TIMEOUT.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>IM001</TD>
+# <TD width=26%>Driver does not support this function</TD>
+# <TD width=52%>(DM) The driver associated with the <I>StatementHandle</I> does not support the function.</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Comments</B></P>
+#
+# <P>This function typically is used before statement execution to retrieve information about columns for a table or tables from the data source's catalog. <B>SQLColumns</B> can be used to retrieve data for all types of items returned by <B>SQLTables</B>. In addition to base tables, this may include (but is not limited to) views, synonyms, system tables, and so on. By contrast, the functions <B>SQLColAttribute</B> and <B>SQLDescribeCol</B> describe the columns in a result set and the function <B>SQLNumResultCols</B> returns the number of columns in a result set. For more information, see "<A HREF="odbcuses_of_catalog_data.htm">Uses of Catalog Data</A>" in Chapter 7: Catalog Functions.</P>
+#
+# <P class="indent"><b class="le">Note</b>&nbsp;&nbsp;&nbsp;For more information about the general use, arguments, and returned data of ODBC catalog functions, see <A HREF="odbccatalog_functions.htm">Chapter 7: Catalog Functions</A>.</P>
+#
+# <P><B>SQLColumns</B> returns the results as a standard result set, ordered by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, and ORDINAL_POSITION. </P>
+#
+# <P class="indent"><b class="le">Note</b>&nbsp;&nbsp;&nbsp;When an application works with an ODBC 2.<I>x</I> driver, no ORDINAL_POSITION column is returned in the result set. As a result, when working with ODBC 2.<I>x</I> drivers, the order of the columns in the column list returned by <B>SQLColumns</B> is not necessarily the same as the order of the columns returned when the application performs a SELECT statement on all columns in that table.</P>
+#
+# <P class="indent"><b class="le">Note</b>&nbsp;&nbsp;&nbsp;<B>SQLColumns</B> might not return all columns. For example, a driver might not return information about pseudo-columns, such as Oracle ROWID. Applications can use any valid column, whether or not it is returned by <B>SQLColumns</B>. </P>
+#
+# <P class="indent">Some columns that can be returned by <B>SQLStatistics</B> are not returned by <B>SQLColumns</B>. For example, <B>SQLColumns</B> does not return the columns in an index created over an expression or filter, such as SALARY + BENEFITS or DEPT = 0012.</P>
+#
+# <P>The lengths of VARCHAR columns are not shown in the table; the actual lengths depend on the data source. To determine the actual lengths of the TABLE_CAT, TABLE_SCHEM, TABLE_NAME, and COLUMN_NAME columns, an application can call <B>SQLGetInfo</B> with the SQL_MAX_CATALOG_NAME_LEN, SQL_MAX_SCHEMA_NAME_LEN, SQL_MAX_TABLE_NAME_LEN, and SQL_MAX_COLUMN_NAME_LEN options.</P>
+#
+# <P>The following columns have been renamed for ODBC 3.<I>x</I>. The column name changes do not affect backward compatibility because applications bind by column number.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=48%>ODBC 2.0 column</TH>
+# <TH width=52%>ODBC 3.<I>x</I> column</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>TABLE_QUALIFIER</TD>
+# <TD width=52%>TABLE_CAT</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>TABLE_OWNER</TD>
+# <TD width=52%>TABLE_SCHEM</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>PRECISION</TD>
+# <TD width=52%>COLUMN_SIZE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>LENGTH</TD>
+# <TD width=52%>BUFFER_LENGTH</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>SCALE</TD>
+# <TD width=52%>DECIMAL_DIGITS</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>RADIX</TD>
+# <TD width=52%>NUM_PREC_RADIX</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P>The following columns have been added to the result set returned by <B>SQLColumns</B> for ODBC 3.<I>x</I>:</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TD width=50%>&nbsp;&nbsp;&nbsp;CHAR_OCTET_LENGTH </TD>
+# <TD width=50%>ORDINAL_POSITION</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>&nbsp;&nbsp;&nbsp;COLUMN_DEF</TD>
+# <TD width=50%>SQL_DATA_TYPE</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>&nbsp;&nbsp;&nbsp;IS_NULLABLE </TD>
+# <TD width=50%>SQL_DATETIME_SUB</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P>The following table lists the columns in the result set. Additional columns beyond column 18 (IS_NULLABLE) can be defined by the driver. An application should gain access to driver-specific columns by counting down from the end of the result set rather than specifying an explicit ordinal position. For more information, see "<A HREF="odbcdata_returned_by_catalog_functions.htm">Data Returned by Catalog Functions</A>" in Chapter 7: Catalog Functions.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=24%><BR>
+# Column name</TH>
+# <TH width=17%>Column<BR>
+# number</TH>
+# <TH width=16%><BR>
+# Data type</TH>
+# <TH width=43%><BR>
+# Comments</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=24%>TABLE_CAT<BR>
+# (ODBC 1.0)</TD>
+# <TD width=17%>1</TD>
+# <TD width=16%>Varchar</TD>
+# <TD width=43%>Catalog name; NULL if not applicable to the data source. If a driver supports catalogs for some tables but not for others, such as when the driver retrieves data from different DBMSs, it returns an empty string ("") for those tables that do not have catalogs.</TD>
+# </TR>
+ { name => "table_cat",
+ type => "varchar",
+ length => 16,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=24%>TABLE_SCHEM<BR>
+# (ODBC 1.0)</TD>
+# <TD width=17%>2</TD>
+# <TD width=16%>Varchar </TD>
+# <TD width=43%>Schema name; NULL if not applicable to the data source. If a driver supports schemas for some tables but not for others, such as when the driver retrieves data from different DBMSs, it returns an empty string ("") for those tables that do not have schemas.</TD>
+# </TR>
+ { name => "table_schem",
+ type => "varchar",
+ length => 16,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=24%>TABLE_NAME<BR>
+# (ODBC 1.0)</TD>
+# <TD width=17%>3</TD>
+# <TD width=16%>Varchar not NULL</TD>
+# <TD width=43%>Table name.</TD>
+# </TR>
+ { name => "table_name",
+ type => "varchar",
+ length => 16,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=24%>COLUMN_NAME<BR>
+# (ODBC 1.0)</TD>
+# <TD width=17%>4</TD>
+# <TD width=16%>Varchar not NULL</TD>
+# <TD width=43%>Column name. The driver returns an empty string for a column that does not have a name.</TD>
+# </TR>
+ { name => "column_name",
+ type => "varchar",
+ length => 16,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=24%>DATA_TYPE<BR>
+# (ODBC 1.0)</TD>
+# <TD width=17%>5</TD>
+# <TD width=16%>Smallint not NULL</TD>
+# <TD width=43%>SQL data type. This can be an ODBC SQL data type or a driver-specific SQL data type. For datetime and interval data types, this column returns the concise data type (such as SQL_TYPE_DATE or SQL_INTERVAL_YEAR_TO_MONTH, rather than the nonconcise data type such as SQL_DATETIME or SQL_INTERVAL). For a list of valid ODBC SQL data types, see "<A HREF="odbcsql_data_types.htm">SQL Data Types</A>" in Appendix D: Data Types. For information about driver-specific SQL data types, see the driver's documentation.
+# <P>The data types returned for ODBC 3.<I>x</I> and ODBC 2.<I>x</I> applications may be different. For more information, see "<A HREF="odbcbackward_compatibility_and_standards_compliance.htm">Backward Compatibility and Standards Compliance</A>" in Chapter 17: Programming Considerations.</P>
+# </TD>
+# </TR>
+ { name => "data_type",
+ type => "smallint",
+ length => undef,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=24%>TYPE_NAME<BR>
+# (ODBC 1.0)</TD>
+# <TD width=17%>6</TD>
+# <TD width=16%>Varchar not NULL</TD>
+# <TD width=43%>Data source&#0150;dependent data type name; for example, "CHAR", "VARCHAR", "MONEY", "LONG VARBINAR", or "CHAR ( ) FOR BIT DATA".</TD>
+# </TR>
+ { name => "type_name",
+ type => "varchar",
+ length => 20,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=24%>COLUMN_SIZE<BR>
+# (ODBC 1.0) </TD>
+# <TD width=17%>7</TD>
+# <TD width=16%>Integer</TD>
+# <TD width=43%>If DATA_TYPE is SQL_CHAR or SQL_VARCHAR, this column contains the maximum length in characters of the column. For datetime data types, this is the total number of characters required to display the value when converted to characters. For numeric data types, this is either the total number of digits or the total number of bits allowed in the column, according to the NUM_PREC_RADIX column. For interval data types, this is the number of characters in the character representation of the interval literal (as defined by the interval leading precision, see "<A HREF="odbcinterval_data_type_length.htm">Interval Data Type Length</A>" in Appendix D: Data Types). For more information, see "<A HREF="odbccolumn_size__decimal_digits__transfer_octet_length__and_display_size.htm">Column Size, Decimal Digits, Transfer Octet Length, and Display Size</A>" in Appendix D: Data Types.</TD>
+# </TR>
+ { name => "column_size",
+ type => "integer",
+ length => undef,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=24%>BUFFER_LENGTH<BR>
+# (ODBC 1.0)</TD>
+# <TD width=17%>8</TD>
+# <TD width=16%>Integer</TD>
+# <TD width=43%>The length in bytes of data transferred on an SQLGetData, SQLFetch, or SQLFetchScroll operation if SQL_C_DEFAULT is specified. For numeric data, this size may be different than the size of the data stored on the data source. This value might be different than COLUMN_SIZE column for character data. For more information about length, see "<A HREF="odbccolumn_size__decimal_digits__transfer_octet_length__and_display_size.htm">Column Size, Decimal Digits, Transfer Octet Length, and Display Size</A>" in Appendix D: Data Types.</TD>
+# </TR>
+ { name => "buffer_length",
+ type => "integer",
+ length => 16,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=24%>DECIMAL_DIGITS<BR>
+# (ODBC 1.0)</TD>
+# <TD width=17%>9</TD>
+# <TD width=16%>Smallint</TD>
+# <TD width=43%>The total number of significant digits to the right of the decimal point. For SQL_TYPE_TIME and SQL_TYPE_TIMESTAMP, this column contains the number of digits in the fractional seconds component. For the other data types, this is the decimal digits of the column on the data source. For interval data types that contain a time component, this column contains the number of digits to the right of the decimal point (fractional seconds). For interval data types that do not contain a time component, this column is 0. For more information about decimal digits, see "<A HREF="odbccolumn_size__decimal_digits__transfer_octet_length__and_display_size.htm">Column Size, Decimal Digits, Transfer Octet Length, and Display Size</A>" in Appendix D: Data Types. NULL is returned for data types where DECIMAL_DIGITS is not applicable.</TD>
+# </TR>
+ { name => "decimal_digits",
+ type => "smallint",
+ length => undef,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=24%>NUM_PREC_RADIX<BR>
+# (ODBC 1.0)</TD>
+# <TD width=17%>10</TD>
+# <TD width=16%>Smallint</TD>
+# <TD width=43%>For numeric data types, either 10 or 2. If it is 10, the values in COLUMN_SIZE and DECIMAL_DIGITS give the number of decimal digits allowed for the column. For example, a DECIMAL(12,5) column would return a NUM_PREC_RADIX of 10, a COLUMN_SIZE of 12, and a DECIMAL_DIGITS of 5; a FLOAT column could return a NUM_PREC_RADIX of 10, a COLUMN_SIZE of 15, and a DECIMAL_DIGITS of NULL.
+# <P>If it is 2, the values in COLUMN_SIZE and DECIMAL_DIGITS give the number of bits allowed in the column. For example, a FLOAT column could return a RADIX of 2, a COLUMN_SIZE of 53, and a DECIMAL_DIGITS of NULL.</P>
+#
+# <P>NULL is returned for data types where NUM_PREC_RADIX is not applicable.</P>
+# </TD>
+# </TR>
+ { name => "num_prec_radix",
+ type => "smallint",
+ length => undef,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=24%>NULLABLE<BR>
+# (ODBC 1.0)</TD>
+# <TD width=17%>11</TD>
+# <TD width=16%>Smallint not NULL</TD>
+# <TD width=43%>SQL_NO_NULLS if the column could not include NULL values.
+# <P>SQL_NULLABLE if the column accepts NULL values.</P>
+#
+# <P>SQL_NULLABLE_UNKNOWN if it is not known whether the column accepts NULL values.</P>
+#
+# <P>The value returned for this column is different from the value returned for the IS_NULLABLE column. The NULLABLE column indicates with certainty that a column can accept NULLs, but cannot indicate with certainty that a column does not accept NULLs. The IS_NULLABLE column indicates with certainty that a column cannot accept NULLs, but cannot indicate with certainty that a column accepts NULLs.</P>
+# </TD>
+# </TR>
+ { name => "nullable",
+ type => "smallint",
+ length => 16,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=24%>REMARKS<BR>
+# (ODBC 1.0)</TD>
+# <TD width=17%>12</TD>
+# <TD width=16%>Varchar</TD>
+# <TD width=43%>A description of the column.</TD>
+# </TR>
+ { name => "remarks",
+ type => "varchar",
+ length => 200,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=24%>COLUMN_DEF<BR>
+# (ODBC 3.0)</TD>
+# <TD width=17%>13</TD>
+# <TD width=16%>Varchar</TD>
+# <TD width=43%>The default value of the column. The value in this column should be interpreted as a string if it is enclosed in quotation marks.
+# <P>If NULL was specified as the default value, then this column is the word NULL, not enclosed in quotation marks. If the default value cannot be represented without truncation, then this column contains TRUNCATED, with no enclosing single quotation marks. If no default value was specified, then this column is NULL.</P>
+#
+# <P>The value of COLUMN_DEF can be used in generating a new column definition, except when it contains the value TRUNCATED.</P>
+# </TD>
+# </TR>
+ { name => "column_def",
+ type => "varchar",
+ length => 100,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=24%>SQL_DATA_TYPE<BR>
+# (ODBC 3.0)</TD>
+# <TD width=17%>14</TD>
+# <TD width=16%>Smallint not NULL</TD>
+# <TD width=43%>SQL data type, as it appears in the SQL_DESC_TYPE record field in the IRD. This can be an ODBC SQL data type or a driver-specific SQL data type. This column is the same as the DATA_TYPE column, with the exception of datetime and interval data types. This column returns the nonconcise data type (such as SQL_DATETIME or SQL_INTERVAL), rather than the concise data type (such as SQL_TYPE_DATE or SQL_INTERVAL_YEAR_TO_MONTH) for datetime and interval data types. If this column returns SQL_DATETIME or SQL_INTERVAL, the specific data type can be determined from the SQL_DATETIME_SUB column. For a list of valid ODBC SQL data types, see "<A HREF="odbcsql_data_types.htm">SQL Data Types</A>" in Appendix D: Data Types. For information about driver-specific SQL data types, see the driver's documentation.
+# <P>The data types returned for ODBC 3.<I>x</I> and ODBC 2.<I>x</I> applications may be different. For more information, see "<A HREF="odbcbackward_compatibility_and_standards_compliance.htm">Backward Compatibility and Standards Compliance</A>" in Chapter 17: Programming Considerations.</P>
+# </TD>
+# </TR>
+ { name => "sql_data_type",
+ type => "smallint",
+ length => undef,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=24%>SQL_DATETIME_SUB<BR>
+# (ODBC 3.0)</TD>
+# <TD width=17%>15</TD>
+# <TD width=16%>Smallint</TD>
+# <TD width=43%>The subtype code for datetime and interval data types. For other data types, this column returns a NULL. For more information about datetime and interval subcodes, see "SQL_DESC_DATETIME_INTERVAL_CODE" in <A HREF="odbcsqlsetdescfield.htm">SQLSetDescField</A>.</TD>
+# </TR>
+ { name => "sql_datetime_sub",
+ type => "smallint",
+ length => undef,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=24%>CHAR_OCTET_LENGTH<BR>
+# (ODBC 3.0)</TD>
+# <TD width=17%>16</TD>
+# <TD width=16%>Integer</TD>
+# <TD width=43%>The maximum length in bytes of a character or binary data type column. For all other data types, this column returns a NULL.</TD>
+# </TR>
+ { name => "char_octet_length",
+ type => "integer",
+ length => undef,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=24%>ORDINAL_POSITION<BR>
+# (ODBC 3.0)</TD>
+# <TD width=17%>17</TD>
+# <TD width=16%>Integer not NULL</TD>
+# <TD width=43%>The ordinal position of the column in the table. The first column in the table is number 1.</TD>
+# </TR>
+ { name => "ordinal_position",
+ type => "integer",
+ length => undef,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=24%>IS_NULLABLE<BR>
+# (ODBC 3.0)</TD>
+# <TD width=17%>18</TD>
+# <TD width=16%>Varchar</TD>
+# <TD width=43%>"NO" if the column does not include NULLs.
+# <P>"YES" if the column could include NULLs.</P>
+#
+# <P>This column returns a zero-length string if nullability is unknown. </P>
+#
+# <P>ISO rules are followed to determine nullability. An ISO SQL&#0150;compliant DBMS cannot return an empty string. </P>
+#
+# <P>The value returned for this column is different from the value returned for the NULLABLE column. (See the description of the NULLABLE column.)</P>
+# </TD>
+# </TR>
+ { name => "is_nullable",
+ type => "varchar",
+ length => 3,
+ nullable => 1,
+ },
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Code Example</B></P>
+#
+# <P>In the following example, an application declares buffers for the result set returned by <B>SQLColumns</B>. It calls <B>SQLColumns</B> to return a result set that describes each column in the EMPLOYEE table. It then calls <B>SQLBindCol</B> to bind the columns in the result set to the buffers. Finally, the application fetches each row of data with <B>SQLFetch</B> and processes it.</P>
+#
+# <PRE class="code">#define STR_LEN 128+1
+# #define REM_LEN 254+1
+#
+# /* Declare buffers for result set data */
+#
+# SQLCHAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;szCatalog[STR_LEN], szSchema[STR_LEN];
+# SQLCHAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;szTableName[STR_LEN], szColumnName[STR_LEN];
+# SQLCHAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;szTypeName[STR_LEN], szRemarks[REM_LEN];
+# SQLCHAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;szColumnDefault[STR_LEN], szIsNullable[STR_LEN];
+# SQLINTEGER&nbsp;&nbsp;&nbsp;&nbsp;ColumnSize, BufferLength, CharOctetLength, OrdinalPosition;
+# SQLSMALLINT&nbsp;&nbsp;&nbsp;DataType, DecimalDigits, NumPrecRadix, Nullable;
+# SQLSMALLINT&nbsp;&nbsp;&nbsp;SQLDataType, DatetimeSubtypeCode;
+# SQLRETURN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retcode;
+# SQLHSTMT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hstmt;
+#
+# /* Declare buffers for bytes available to return */
+#
+# SQLINTEGER cbCatalog, cbSchema, cbTableName, cbColumnName;
+# SQLINTEGER cbDataType, cbTypeName, cbColumnSize, cbBufferLength;
+# SQLINTEGER cbDecimalDigits, cbNumPrecRadix, cbNullable, cbRemarks;
+# SQLINTEGER cbColumnDefault, cbSQLDataType, cbDatetimeSubtypeCode, cbCharOctetLength;
+# SQLINTEGER cbOrdinalPosition, cbIsNullable;
+#
+# retcode = SQLColumns(hstmt,
+# NULL, 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* All catalogs */
+# NULL, 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* All schemas */
+# "CUSTOMERS", SQL_NTS,&nbsp;&nbsp;&nbsp;/* CUSTOMERS table */
+# NULL, 0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* All columns */
+#
+# if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
+#
+# /* Bind columns in result set to buffers */
+#
+# SQLBindCol(hstmt, 1, SQL_C_CHAR, szCatalog, STR_LEN,&amp;cbCatalog);
+# SQLBindCol(hstmt, 2, SQL_C_CHAR, szSchema, STR_LEN, &amp;cbSchema);
+# SQLBindCol(hstmt, 3, SQL_C_CHAR, szTableName, STR_LEN,&amp;cbTableName);
+# SQLBindCol(hstmt, 4, SQL_C_CHAR, szColumnName, STR_LEN, &amp;cbColumnName);
+# SQLBindCol(hstmt, 5, SQL_C_SSHORT, &amp;DataType, 0, &amp;cbDataType);
+# SQLBindCol(hstmt, 6, SQL_C_CHAR, szTypeName, STR_LEN, &amp;cbTypeName);
+# SQLBindCol(hstmt, 7, SQL_C_SLONG, &amp;ColumnSize, 0, &amp;cbColumnSize);
+# SQLBindCol(hstmt, 8, SQL_C_SLONG, &amp;BufferLength, 0, &amp;cbBufferLength);
+# SQLBindCol(hstmt, 9, SQL_C_SSHORT, &amp;DecimalDigits, 0, &amp;cbDecimalDigits);
+# SQLBindCol(hstmt, 10, SQL_C_SSHORT, &amp;NumPrecRadix, 0, &amp;cbNumPrecRadix);
+# SQLBindCol(hstmt, 11, SQL_C_SSHORT, &amp;Nullable, 0, &amp;cbNullable);
+# SQLBindCol(hstmt, 12, SQL_C_CHAR, szRemarks, REM_LEN, &amp;cbRemarks);
+# SQLBindCol(hstmt, 13, SQL_C_CHAR, szColumnDefault, STR_LEN, &amp;cbColumnDefault);
+# SQLBindCol(hstmt, 14, SQL_C_SSHORT, &amp;SQLDataType, 0, &amp;cbSQLDataType);
+# SQLBindCol(hstmt, 15, SQL_C_SSHORT, &amp;DatetimeSubtypeCode, 0,
+# &amp;cbDatetimeSubtypeCode);
+# SQLBindCol(hstmt, 16, SQL_C_SLONG, &amp;CharOctetLength, 0, &amp;cbCharOctetLength);
+# SQLBindCol(hstmt, 17, SQL_C_SLONG, &amp;OrdinalPosition, 0, &amp;cbOrdinalPosition);
+# SQLBindCol(hstmt, 18, SQL_C_CHAR, szIsNullable, STR_LEN, &amp;cbIsNullable);
+# while(TRUE) {
+# retcode = SQLFetch(hstmt);
+# if (retcode == SQL_ERROR || retcode == SQL_SUCCESS_WITH_INFO) {
+# show_error( );
+# }
+# if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO){
+# ; /* Process fetched data */
+# } else {
+# break;
+# }
+# }
+# }</PRE>
+#
+# <P class="label"><B>Related Functions</B></P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=50%>For information about</TH>
+# <TH width=50%>See</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Binding a buffer to a column in a result set</TD>
+# <TD width=50%><A HREF="odbcsqlbindcol.htm">SQLBindCol</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Canceling statement processing</TD>
+# <TD width=50%><A HREF="odbcsqlcancel.htm">SQLCancel</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Returning privileges for a column or columns</TD>
+# <TD width=50%><A HREF="odbcsqlcolumnprivileges.htm">SQLColumnPrivileges</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Fetching a block of data or scrolling through a result set</TD>
+# <TD width=50%><A HREF="odbcsqlfetchscroll.htm">SQLFetchScroll</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Fetching multiple rows of data</TD>
+# <TD width=50%><A HREF="odbcsqlfetch.htm">SQLFetch</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Returning columns that uniquely identify a row, or columns automatically updated by a transaction</TD>
+# <TD width=50%><A HREF="odbcsqlspecialcolumns.htm">SQLSpecialColumns</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Returning table statistics and indexes</TD>
+# <TD width=50%><A HREF="odbcsqlstatistics.htm">SQLStatistics</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Returning a list of tables in a data source</TD>
+# <TD width=50%><A HREF="odbcsqltables.htm">SQLTables</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Returning privileges for a table or tables</TD>
+# <TD width=50%><A HREF="odbcsqltableprivileges.htm">SQLTablePrivileges</A></TD>
+# </TR>
+# </table></div>
+# <!--TS:--><H4><A NAME="feedback"></A></H4>
+# <SPAN id="SDKFeedB"></SPAN>
+# </div>
+#
+# </BODY>
+# </HTML>
+];
+
+#
+# odbcsqlprimarykeys.htm
+#
+$listWhat->{primarykeys} = [
+# <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+# <HTML DIR="LTR"><HEAD>
+# <META HTTP-EQUIV="Content-Type" Content="text/html; charset=Windows-1252">
+# <TITLE>SQLPrimaryKeys</TITLE>
+# <SCRIPT SRC="/stylesheets/vs70link.js"></SCRIPT>
+# <SCRIPT SRC="/stylesheets/vs70.js"></SCRIPT>
+# <SCRIPT LANGUAGE="JScript" SRC="/stylesheets/odbc.js"></SCRIPT>
+# </HEAD>
+# <body topmargin=0 id="bodyID">
+#
+# <div id="nsbanner">
+# <div id="bannertitle">
+# <TABLE CLASS="bannerparthead" CELLSPACING=0>
+# <TR ID="hdr">
+# <TD CLASS="bannertitle" nowrap>
+# ODBC Programmer's Reference
+# </TD><TD valign=middle><a href="#Feedback"><IMG name="feedb" onclick=EMailStream(SDKFeedB) style="CURSOR: hand;" hspace=15 alt="" src="/stylesheets/mailto.gif" align=right></a></TD>
+# </TR>
+# </TABLE>
+# </div>
+# </div>
+# <DIV id="nstext" valign="bottom">
+#
+# <H1><A NAME="odbcsqlprimarykeys"></A>SQLPrimaryKeys</H1>
+#
+# <P class="label"><B>Conformance</B></P>
+#
+# <P>Version Introduced: ODBC 1.0<BR>
+# Standards Compliance: ODBC</P>
+#
+# <P class="label"><B>Summary</B></P>
+#
+# <P><B>SQLPrimaryKeys</B> returns the column names that make up the primary key for a table. The driver returns the information as a result set. This function does not support returning primary keys from multiple tables in a single call.</P>
+#
+# <P class="label"><B>Syntax</B></P>
+#
+# <PRE class="syntax">SQLRETURN <B>SQLPrimaryKeys</B>(
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLHSTMT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>StatementHandle</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLCHAR *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>CatalogName</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLSMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>NameLength1</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLCHAR *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>SchemaName</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLSMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>NameLength2</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLCHAR *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>TableName</I>,
+# &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQLSMALLINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>NameLength3</I>);</PRE>
+#
+# <P class="label"><B>Arguments</B>
+#
+# <DL>
+# <DT><I>StatementHandle</I></DT>
+#
+# <DD>[Input]<BR>
+# Statement handle.</dd>
+#
+# <DT><I>CatalogName</I></DT>
+#
+# <DD>[Input]<BR>
+# Catalog name. If a driver supports catalogs for some tables but not for others, such as when the driver retrieves data from different DBMSs, an empty string ("") denotes those tables that do not have catalogs. <I>CatalogName </I>cannot contain a string search pattern.
+#
+# <P>If the SQL_ATTR_METADATA_ID statement attribute is set to SQL_TRUE, <I>CatalogName</I> is treated as an identifier and its case is not significant. If it is SQL_FALSE, <I>CatalogName</I> is an ordinary argument; it is treated literally, and its case is significant. For more information, see "<A HREF="odbcarguments_in_catalog_functions.htm">Arguments in Catalog Functions</A>" in Chapter 7: Catalog Functions.
+# </dd>
+#
+# <DT><I>NameLength1</I></DT>
+#
+# <DD>[Input]<BR>
+# Length in bytes of *<I>CatalogName</I>.</dd>
+#
+# <DT><I>SchemaName</I></DT>
+#
+# <DD>[Input]<BR>
+# Schema name. If a driver supports schemas for some tables but not for others, such as when the driver retrieves data from different DBMSs, an empty string ("") denotes those tables that do not have schemas. <I>SchemaName </I>cannot contain a string search pattern.
+#
+# <P>If the SQL_ATTR_METADATA_ID statement attribute is set to SQL_TRUE, <I>SchemaName</I> is treated as an identifier and its case is not significant. If it is SQL_FALSE, <I>SchemaName</I> is an ordinary argument; it is treated literally, and its case is not significant.
+# </dd>
+#
+# <DT><I>NameLength2</I></DT>
+#
+# <DD>[Input]<BR>
+# Length in bytes of *<I>SchemaName</I>.</dd>
+#
+# <DT><I>TableName</I></DT>
+#
+# <DD>[Input]<BR>
+# Table name. This argument cannot be a null pointer. <I>TableName </I>cannot contain a string search pattern.
+#
+# <P>If the SQL_ATTR_METADATA_ID statement attribute is set to SQL_TRUE, <I>TableName</I> is treated as an identifier and its case is not significant. If it is SQL_FALSE, <I>TableName</I> is an ordinary argument; it is treated literally, and its case is not significant.
+# </dd>
+#
+# <DT><I>NameLength3</I></DT>
+#
+# <DD>[Input]<BR>
+# Length in bytes of *<I>TableName</I>.</dd>
+# </DL>
+#
+# <P class="label"><B>Returns</B></P>
+#
+# <P>SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR, or SQL_INVALID_HANDLE.</P>
+#
+# <P class="label"><B>Diagnostics</B></P>
+#
+# <P>When <B>SQLPrimaryKeys</B> returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, an associated SQLSTATE value can be obtained by calling <B>SQLGetDiagRec</B> with a <I>HandleType</I> of SQL_HANDLE_STMT and a <I>Handle</I> of <I>StatementHandle</I>. The following table lists the SQLSTATE values commonly returned by <B>SQLPrimaryKeys</B> and explains each one in the context of this function; the notation "(DM)" precedes the descriptions of SQLSTATEs returned by the Driver Manager. The return code associated with each SQLSTATE value is SQL_ERROR, unless noted otherwise.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=22%>SQLSTATE</TH>
+# <TH width=26%>Error</TH>
+# <TH width=52%>Description</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>01000</TD>
+# <TD width=26%>General warning</TD>
+# <TD width=52%>Driver-specific informational message. (Function returns SQL_SUCCESS_WITH_INFO.)</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>08S01</TD>
+# <TD width=26%>Communication link failure</TD>
+# <TD width=52%>The communication link between the driver and the data source to which the driver was connected failed before the function completed processing.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>24000</TD>
+# <TD width=26%>Invalid cursor state</TD>
+# <TD width=52%>(DM) A cursor was open on the <I>StatementHandle</I>, and <B>SQLFetch</B> or <B>SQLFetchScroll</B> had been called.
+# <P>A cursor was open on the <I>StatementHandle</I>, but <B>SQLFetch</B> or <B>SQLFetchScroll</B> had not been called.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>40001</TD>
+# <TD width=26%>Serialization failure</TD>
+# <TD width=52%>The transaction was rolled back due to a resource deadlock with another transaction.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>40003</TD>
+# <TD width=26%>Statement completion unknown</TD>
+# <TD width=52%>The associated connection failed during the execution of this function, and the state of the transaction cannot be determined.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY000</TD>
+# <TD width=26%>General error</TD>
+# <TD width=52%>An error occurred for which there was no specific SQLSTATE and for which no implementation-specific SQLSTATE was defined. The error message returned by <B>SQLGetDiagRec</B> in the <I>*MessageText</I> buffer describes the error and its cause.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY001</TD>
+# <TD width=26%>Memory allocation error</TD>
+# <TD width=52%>The driver was unable to allocate memory required to support execution or completion of the function.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY008</TD>
+# <TD width=26%>Operation canceled</TD>
+# <TD width=52%>Asynchronous processing was enabled for the <I>StatementHandle</I>. The function was called, and before it completed execution, <B>SQLCancel</B> was called on the <I>StatementHandle</I>. Then the function was called again on the <I>StatementHandle</I>.
+# <P>The function was called, and before it completed execution, <B>SQLCancel</B> was called on the <I>StatementHandle</I> from a different thread in a multithread application.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY009</TD>
+# <TD width=26%>Invalid use of null pointer</TD>
+# <TD width=52%>(DM) The <I>TableName</I> argument was a null pointer.
+# <P>The SQL_ATTR_METADATA_ID statement attribute was set to SQL_TRUE, the <I>CatalogName</I> argument was a null pointer, and <B>SQLGetInfo</B> with the SQL_CATALOG_NAME information type returns that catalog names are supported.</P>
+#
+# <P>(DM) The SQL_ATTR_METADATA_ID statement attribute was set to SQL_TRUE, and the <I>SchemaName</I> argument was a null pointer.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY010</TD>
+# <TD width=26%>Function sequence error</TD>
+# <TD width=52%>(DM) An asynchronously executing function (not this one) was called for the <I>StatementHandle</I> and was still executing when this function was called.
+# <P>(DM) <B>SQLExecute</B>, <B>SQLExecDirect</B>, <B>SQLBulkOperations</B>, or <B>SQLSetPos</B> was called for the <I>StatementHandle</I> and returned SQL_NEED_DATA. This function was called before data was sent for all data-at-execution parameters or columns.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY013</TD>
+# <TD width=26%>Memory management error</TD>
+# <TD width=52%>The function call could not be processed because the underlying memory objects could not be accessed, possibly because of low memory conditions.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HY090</TD>
+# <TD width=26%>Invalid string or buffer length</TD>
+# <TD width=52%>(DM) The value of one of the name length arguments was less than 0 but not equal to SQL_NTS, and the associated name argument is not a null pointer.
+# <P>The value of one of the name length arguments exceeded the maximum length value for the corresponding name.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYC00</TD>
+# <TD width=26%>Optional feature not implemented</TD>
+# <TD width=52%>A catalog was specified, and the driver or data source does not support catalogs.
+# <P>A schema was specified and the driver or data source does not support schemas.</P>
+#
+# <P>The combination of the current settings of the SQL_ATTR_CONCURRENCY and SQL_ATTR_CURSOR_TYPE statement attributes was not supported by the driver or data source.</P>
+#
+# <P>The SQL_ATTR_USE_BOOKMARKS statement attribute was set to SQL_UB_VARIABLE, and the SQL_ATTR_CURSOR_TYPE statement attribute was set to a cursor type for which the driver does not support bookmarks.</P>
+# </TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYT00</TD>
+# <TD width=26%>Timeout expired</TD>
+# <TD width=52%>The timeout period expired before the data source returned the requested result set. The timeout period is set through <B>SQLSetStmtAttr</B>, SQL_ATTR_QUERY_TIMEOUT.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>HYT01</TD>
+# <TD width=26%>Connection timeout expired</TD>
+# <TD width=52%>The connection timeout period expired before the data source responded to the request. The connection timeout period is set through <B>SQLSetConnectAttr</B>, SQL_ATTR_CONNECTION_TIMEOUT.</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=22%>IM001</TD>
+# <TD width=26%>Driver does not support this function</TD>
+# <TD width=52%>(DM) The driver associated with the <I>StatementHandle</I> does not support the function.</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Comments</B></P>
+#
+# <P><B>SQLPrimaryKeys</B> returns the results as a standard result set, ordered by TABLE_CAT, TABLE_SCHEM, TABLE_NAME, and KEY_SEQ. For information about how this information might be used, see "<A HREF="odbcuses_of_catalog_data.htm">Uses of Catalog Data</A>" in Chapter 7: Catalog Functions.</P>
+#
+# <P>The following columns have been renamed for ODBC 3.<I>x</I>. The column name changes do not affect backward compatibility because applications bind by column number.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=48%>ODBC 2.0 column</TH>
+# <TH width=52%>ODBC 3.<I>x</I> column</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>TABLE_QUALIFIER</TD>
+# <TD width=52%>TABLE_CAT</TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=48%>TABLE_OWNER</TD>
+# <TD width=52%>TABLE_SCHEM</TD>
+# </TR>
+# </table></div>
+# <!--TS:-->
+# <P>To determine the actual lengths of the TABLE_CAT, TABLE_SCHEM, TABLE_NAME, and COLUMN_NAME columns, call <B>SQLGetInfo</B> with the SQL_MAX_CATALOG_NAME_LEN, SQL_MAX_SCHEMA_NAME_LEN, SQL_MAX_TABLE_NAME_LEN, and SQL_MAX_COLUMN_NAME_LEN options.</P>
+#
+# <P class="indent"><b class="le">Note</b>&nbsp;&nbsp;&nbsp;For more information about the general use, arguments, and returned data of ODBC catalog functions, see <A HREF="odbccatalog_functions.htm">Chapter 7: Catalog Functions</A>.</P>
+#
+# <P>The following table lists the columns in the result set. Additional columns beyond column 6 (PK_NAME) can be defined by the driver. An application should gain access to driver-specific columns by counting down from the end of the result set rather than specifying an explicit ordinal position. For more information, see "<A HREF="odbcdata_returned_by_catalog_functions.htm">Data Returned by Catalog Functions</A>" in Chapter 7: Catalog Functions.</P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=27%><BR>
+# Column name</TH>
+# <TH width=15%>Column number</TH>
+# <TH width=16%><BR>
+# Data type</TH>
+# <TH width=42%><BR>
+# Comments</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=27%>TABLE_CAT<BR>
+# (ODBC 1.0)</TD>
+# <TD width=15%>1</TD>
+# <TD width=16%>Varchar</TD>
+# <TD width=42%>Primary key table catalog name; NULL if not applicable to the data source. If a driver supports catalogs for some tables but not for others, such as when the driver retrieves data from different DBMSs, it returns an empty string ("") for those tables that do not have catalogs.</TD>
+# </TR>
+ { name => "table_cat",
+ type => "varchar",
+ length => 16,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=27%>TABLE_SCHEM<BR>
+# (ODBC 1.0)</TD>
+# <TD width=15%>2</TD>
+# <TD width=16%>Varchar</TD>
+# <TD width=42%>Primary key table schema name; NULL if not applicable to the data source. If a driver supports schemas for some tables but not for others, such as when the driver retrieves data from different DBMSs, it returns an empty string ("") for those tables that do not have schemas.</TD>
+# </TR>
+ { name => "table_schem",
+ type => "varchar",
+ length => 16,
+ nullable => 1,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=27%>TABLE_NAME<BR>
+# (ODBC 1.0)</TD>
+# <TD width=15%>3</TD>
+# <TD width=16%>Varchar<BR>
+# not NULL</TD>
+# <TD width=42%>Primary key table name.</TD>
+# </TR>
+ { name => "table_name",
+ type => "varchar",
+ length => 16,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=27%>COLUMN_NAME<BR>
+# (ODBC 1.0)</TD>
+# <TD width=15%>4</TD>
+# <TD width=16%>Varchar<BR>
+# not NULL</TD>
+# <TD width=42%>Primary key column name. The driver returns an empty string for a column that does not have a name.</TD>
+# </TR>
+ { name => "column_name",
+ type => "varchar",
+ length => 16,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=27%>KEY_SEQ<BR>
+# (ODBC 1.0)</TD>
+# <TD width=15%>5</TD>
+# <TD width=16%>Smallint<BR>
+# not NULL</TD>
+# <TD width=42%>Column sequence number in key (starting with 1).</TD>
+# </TR>
+ { name => "key_seq",
+ type => "smallint",
+ length => undef,
+ nullable => 0,
+ },
+#
+# <TR VALIGN="top">
+# <TD width=27%>PK_NAME<BR>
+# (ODBC 2.0)</TD>
+# <TD width=15%>6</TD>
+# <TD width=16%>Varchar</TD>
+# <TD width=42%>Primary key name. NULL if not applicable to the data source.</TD>
+# </TR>
+ { name => "pk_name",
+ type => "varchar",
+ length => 16,
+ nullable => 1,
+ },
+# </table></div>
+# <!--TS:-->
+# <P class="label"><B>Code Example</B></P>
+#
+# <P>See <A HREF="odbcsqlforeignkeys.htm">SQLForeignKeys</A>.</P>
+#
+# <P class="label"><B>Related Functions</B></P>
+# <!--TS:--><div class="tablediv"><table>
+#
+# <TR VALIGN="top">
+# <TH width=50%>For information about</TH>
+# <TH width=50%>See</TH>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Binding a buffer to a column in a result set</TD>
+# <TD width=50%><A HREF="odbcsqlbindcol.htm">SQLBindCol</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Canceling statement processing</TD>
+# <TD width=50%><A HREF="odbcsqlcancel.htm">SQLCancel</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Fetching a block of data or scrolling through a result set</TD>
+# <TD width=50%><A HREF="odbcsqlfetchscroll.htm">SQLFetchScroll</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Fetching a single row or a block of data in a forward-only direction</TD>
+# <TD width=50%><A HREF="odbcsqlfetch.htm">SQLFetch</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Returning the columns of foreign keys</TD>
+# <TD width=50%><A HREF="odbcsqlforeignkeys.htm">SQLForeignKeys</A></TD>
+# </TR>
+#
+# <TR VALIGN="top">
+# <TD width=50%>Returning table statistics and indexes</TD>
+# <TD width=50%><A HREF="odbcsqlstatistics.htm">SQLStatistics</A></TD>
+# </TR>
+# </table></div>
+# <!--TS:--><H4><A NAME="feedback"></A></H4>
+# <SPAN id="SDKFeedB"></SPAN>
+# </div>
+#
+# </BODY>
+# </HTML>
+];
+
+my $list = $listWhat->{$what} or die "$what?";
+my $i4 = " " x 4;
+if ($opt eq '-l') {
+ print join(", ", map($_->{name}, @$list)), "\n";
+ exit;
+}
+if ($opt eq '-c') {
+ my $pos = 0;
+ for my $p (@$list) {
+ print "${i4}ConnSys::Column::Column(\n";
+ $pos++;
+ print "\t$pos,\n";
+ print "\t\"" . uc($p->{name}) . "\",\n";
+ print "\tfalse,\n";
+ print "\tNdbType(NdbType::";
+ if ($p->{type} eq 'varchar') {
+ print "String, 8, $p->{length}";
+ } else {
+ print "Signed, 32, 1";
+ }
+ print ", " . ($p->{nullable} ? "true" : "false");
+ print ")\n";
+ print "${i4}),\n";
+ }
+ exit;
+}
+print "$opt?\n";
+
+# vim: set sw=4:
diff --git a/storage/ndb/src/old_files/client/odbc/docs/type.txt b/storage/ndb/src/old_files/client/odbc/docs/type.txt
new file mode 100644
index 00000000000..d7b391afc55
--- /dev/null
+++ b/storage/ndb/src/old_files/client/odbc/docs/type.txt
@@ -0,0 +1,333 @@
+ODBC Programmer's Reference
+****** SQL Data Types ******
+Each DBMS defines its own SQL types. Each ODBC driver exposes only those SQL
+data types that the associated DBMS defines. How a driver maps DBMS SQL types
+to the ODBC-defined SQL type identifiers and how a driver maps DBMS SQL types
+to its own driver-specific SQL type identifiers are returned through a call to
+SQLGetTypeInfo. A driver also returns the SQL data types when describing the
+data types of columns and parameters through calls to SQLColAttribute,
+SQLColumns, SQLDescribeCol, SQLDescribeParam, SQLProcedureColumns, and
+SQLSpecialColumns.
+Note The SQL data types are contained in the SQL_DESC_ CONCISE_TYPE,
+SQL_DESC_TYPE, and SQL_DESC_DATETIME_INTERVAL_CODE fields of the implementation
+descriptors. Characteristics of the SQL data types are contained in the
+SQL_DESC_PRECISION, SQL_DESC_SCALE, SQL_DESC_LENGTH, and SQL_DESC_OCTET_LENGTH
+fields of the implementation descriptors. For more information, see "Data_Type
+Identifiers_and_Descriptors" later in this appendix.
+A given driver and data source do not necessarily support all of the SQL data
+types defined in this appendix. A driver's support for SQL data types depends
+on the level of SQL-92 that the driver conforms to. To determine the level of
+SQL-92 grammar supported by the driver, an application calls SQLGetInfo with
+the SQL_SQL_CONFORMANCE information type. Furthermore, a given driver and data
+source may support additional, driver-specific SQL data types. To determine
+which data types a driver supports, an application calls SQLGetTypeInfo. For
+information about driver-specific SQL data types, see the driver's
+documentation. For information about the data types in a specific data source,
+see the documentation for that data source.
+Important The tables throughout this appendix are only guidelines and show
+commonly used names, ranges, and limits of SQL data types. A given data source
+might support only some of the listed data types, and the characteristics of
+the supported data types can differ from those listed.
+The following table lists valid SQL type identifiers for all SQL data types.
+The table also lists the name and description of the corresponding data type
+from SQL-92 (if one exists).
+SQL type identifier[1] Typical SQL data Typical type description
+ type[2]
+SQL_CHAR CHAR(n) Character string of fixed
+ string length n.
+SQL_VARCHAR VARCHAR(n) Variable-length character
+ string with a maximum
+ string length n.
+SQL_LONGVARCHAR LONG VARCHAR Variable length character
+ data. Maximum length is
+ data source–dependent.[9]
+SQL_WCHAR WCHAR(n) Unicode character string
+ of fixed string length n
+SQL_WVARCHAR VARWCHAR(n) Unicode variable-length
+ character string with a
+ maximum string length n
+SQL_WLONGVARCHAR LONGWVARCHAR Unicode variable-length
+ character data. Maximum
+ length is data
+ source–dependent
+SQL_DECIMAL DECIMAL(p,s) Signed, exact, numeric
+ value with a precision of
+ at least p and scale s.
+ (The maximum precision is
+ driver-defined.)
+ (1 <= p <= 15; s <= p).
+ [4]
+SQL_NUMERIC NUMERIC(p,s) Signed, exact, numeric
+ value with a precision p
+ and scale s
+ (1 <= p <= 15; s <= p).
+ [4]
+SQL_SMALLINT SMALLINT Exact numeric value with
+ precision 5 and scale 0
+ (signed:
+ –32,768 <= n <= 32,767,
+ unsigned:
+ 0 <= n <= 65,535)[3].
+SQL_INTEGER INTEGER Exact numeric value with
+ precision 10 and scale 0
+ (signed:
+ –2[31] <= n <= 2[31] – 1,
+ unsigned:
+ 0 <= n <= 2[32] – 1)[3].
+SQL_REAL REAL Signed, approximate,
+ numeric value with a
+ binary precision 24 (zero
+ or absolute value 10[–38]
+ to 10[38]).
+SQL_FLOAT FLOAT(p) Signed, approximate,
+ numeric value with a
+ binary precision of at
+ least p. (The maximum
+ precision is driver-
+ defined.)[5]
+SQL_DOUBLE DOUBLE PRECISION Signed, approximate,
+ numeric value with a
+ binary precision 53 (zero
+ or absolute value 10
+ [–308] to 10[308]).
+SQL_BIT BIT Single bit binary data.
+ [8]
+SQL_TINYINT TINYINT Exact numeric value with
+ precision 3 and scale 0
+ (signed:
+ –128 <= n <= 127,
+ unsigned:
+ 0 <= n <= 255)[3].
+SQL_BIGINT BIGINT Exact numeric value with
+ precision 19 (if signed)
+ or 20 (if unsigned) and
+ scale 0
+ (signed:
+ –2[63] <= n <= 2[63] – 1,
+
+ unsigned:
+ 0 <= n <= 2[64] – 1)[3],
+ [9].
+SQL_BINARY BINARY(n) Binary data of fixed
+ length n.[9]
+SQL_VARBINARY VARBINARY(n) Variable length binary
+ data of maximum length n.
+ The maximum is set by the
+ user.[9]
+SQL_LONGVARBINARY LONG VARBINARY Variable length binary
+ data. Maximum length is
+ data source–dependent.[9]
+SQL_TYPE_DATE[6] DATE Year, month, and day
+ fields, conforming to the
+ rules of the Gregorian
+ calendar. (See
+ "Constraints_of_the
+ Gregorian_Calendar,"
+ later in this appendix.)
+SQL_TYPE_TIME[6] TIME(p) Hour, minute, and second
+ fields, with valid values
+ for hours of 00 to 23,
+ valid values for minutes
+ of 00 to 59, and valid
+ values for seconds of 00
+ to 61. Precision p
+ indicates the seconds
+ precision.
+SQL_TYPE_TIMESTAMP[6] TIMESTAMP(p) Year, month, day, hour,
+ minute, and second
+ fields, with valid values
+ as defined for the DATE
+ and TIME data types.
+SQL_INTERVAL_MONTH[7] INTERVAL MONTH(p) Number of months between
+ two dates; p is the
+ interval leading
+ precision.
+SQL_INTERVAL_YEAR[7] INTERVAL YEAR(p) Number of years between
+ two dates; p is the
+ interval leading
+ precision.
+SQL_INTERVAL_YEAR_TO_MONTH[7] INTERVAL YEAR(p) TO Number of years and
+ MONTH months between two dates;
+ p is the interval leading
+ precision.
+SQL_INTERVAL_DAY[7] INTERVAL DAY(p) Number of days between
+ two dates; p is the
+ interval leading
+ precision.
+SQL_INTERVAL_HOUR[7] INTERVAL HOUR(p) Number of hours between
+ two date/times; p is the
+ interval leading
+ precision.
+SQL_INTERVAL_MINUTE[7] INTERVAL MINUTE(p) Number of minutes between
+ two date/times; p is the
+ interval leading
+ precision.
+SQL_INTERVAL_SECOND[7] INTERVAL SECOND(p,q) Number of seconds between
+ two date/times; p is the
+ interval leading
+ precision and q is the
+ interval seconds
+ precision.
+SQL_INTERVAL_DAY_TO_HOUR[7] INTERVAL DAY(p) TO HOUR Number of days/hours
+ between two date/times; p
+ is the interval leading
+ precision.
+SQL_INTERVAL_DAY_TO_MINUTE[7] INTERVAL DAY(p) TO Number of days/hours/
+ MINUTE minutes between two date/
+ times; p is the interval
+ leading precision.
+SQL_INTERVAL_DAY_TO_SECOND[7] INTERVAL DAY(p) TO Number of days/hours/
+ SECOND(q) minutes/seconds between
+ two date/times; p is the
+ interval leading
+ precision and q is the
+ interval seconds
+ precision.
+SQL_INTERVAL_HOUR_TO_MINUTE INTERVAL HOUR(p) TO Number of hours/minutes
+[7] MINUTE between two date/times; p
+ is the interval leading
+ precision.
+SQL_INTERVAL_HOUR_TO_SECOND INTERVAL HOUR(p) TO Number of hours/minutes/
+[7] SECOND(q) seconds between two date/
+ times; p is the interval
+ leading precision and q
+ is the interval seconds
+ precision.
+SQL_INTERVAL_MINUTE_TO_SECOND INTERVAL MINUTE(p) TO Number of minutes/seconds
+[7] SECOND(q) between two date/times; p
+ is the interval leading
+ precision and q is the
+ interval seconds
+ precision.
+SQL_GUID GUID Fixed length Globally
+ Unique Identifier.
+[1] This is the value returned in the DATA_TYPE column by a call to
+SQLGetTypeInfo.
+[2] This is the value returned in the NAME and CREATE PARAMS column by a call
+to SQLGetTypeInfo. The NAME column returns the designation—for example,
+CHAR—while the CREATE PARAMS column returns a comma-separated list of creation
+parameters such as precision, scale, and length.
+[3] An application uses SQLGetTypeInfo or SQLColAttribute to determine if a
+particular data type or a particular column in a result set is unsigned.
+[4] SQL_DECIMAL and SQL_NUMERIC data types differ only in their precision.
+The precision of a DECIMAL(p,s) is an implementation-defined decimal precision
+that is no less than p, while the precision of a NUMERIC(p,s) is exactly equal
+to p.
+[5] Depending on the implementation, the precision of SQL_FLOAT can be either
+24 or 53: if it is 24, the SQL_FLOAT data type is the same as SQL_REAL; if it
+is 53, the SQL_FLOAT data type is the same as SQL_DOUBLE.
+[6] In ODBC 3.x, the SQL date, time, and timestamp data types are
+SQL_TYPE_DATE, SQL_TYPE_TIME, and SQL_TYPE_TIMESTAMP, respectively; in ODBC
+2.x, the data types are SQL_DATE, SQL_TIME, and SQL_TIMESTAMP.
+[7] For more information on the interval SQL data types, see the "Interval
+Data_Types" section, later in this appendix.
+[8] The SQL_BIT data type has different characteristics than the BIT type in
+SQL-92.
+[9] This data type has no corresponding data type in SQL-92.
+ODBC Programmer's Reference
+************ CC DDaattaa TTyyppeess ************
+ODBC C data types indicate the data type of C buffers used to store data in the
+application.
+All drivers must support all C data types. This is required because all drivers
+must support all C types to which SQL types that they support can be converted,
+and all drivers support at least one character SQL type. Because the character
+SQL type can be converted to and from all C types, all drivers must support all
+C types.
+The C data type is specified in the SSQQLLBBiinnddCCoolland SSQQLLGGeettDDaattaa functions with the
+TargetType argument and in the SSQQLLBBiinnddPPaarraammeetteerr function with the ValueType
+argument. It can also be specified by calling SSQQLLSSeettDDeessccFFiieelldd to set the
+SQL_DESC_CONCISE_TYPE field of an ARD or APD, or by calling SSQQLLSSeettDDeessccRReecc with
+the Type argument (and the SubType argument if needed) and the DescriptorHandle
+argument set to the handle of an ARD or APD.
+The following table lists valid type identifiers for the C data types. The
+table also lists the ODBC C data type that corresponds to each identifier and
+the definition of this data type.
+CC ttyyppee iiddeennttiiffiieerr OODDBBCC CC ttyyppeeddeeff CC ttyyppee
+SQL_C_CHAR SQLCHAR * unsigned char *
+SQL_C_SSHORT[j] SQLSMALLINT short int
+SQL_C_USHORT[j] SQLUSMALLINT unsigned short int
+SQL_C_SLONG[j] SQLINTEGER long int
+SQL_C_ULONG[j] SQLUINTEGER unsigned long int
+SQL_C_FLOAT SQLREAL float
+SQL_C_DOUBLE SQLDOUBLE, SQLFLOAT double
+SQL_C_BIT SQLCHAR unsigned char
+SQL_C_STINYINT[j] SQLSCHAR signed char
+SQL_C_UTINYINT[j] SQLCHAR unsigned char
+SQL_C_SBIGINT SQLBIGINT _int64[h]
+SQL_C_UBIGINT SQLUBIGINT unsigned _int64[h]
+SQL_C_BINARY SQLCHAR * unsigned char *
+SQL_C_BOOKMARK[i] BOOKMARK unsigned long int[d]
+SQL_C_VARBOOKMARK SQLCHAR * unsigned char *
+SQL_C_TYPE_DATE[c] SQL_DATE_STRUCT struct tagDATE_STRUCT {
+ SQLSMALLINT year;
+ SQLUSMALLINT month;
+ SQLUSMALLINT day;
+ } DATE_STRUCT;[a]
+SQL_C_TYPE_TIME[c] SQL_TIME_STRUCT struct tagTIME_STRUCT {
+ SQLUSMALLINT hour;
+ SQLUSMALLINT minute;
+ SQLUSMALLINT second;
+ } TIME_STRUCT;[a]
+SQL_C_TYPE_TIMESTAMP[c] SQL_TIMESTAMP_STRUCT struct tagTIMESTAMP_STRUCT {
+ SQLSMALLINT year;
+ SQLUSMALLINT month;
+ SQLUSMALLINT day;
+ SQLUSMALLINT hour;
+ SQLUSMALLINT minute;
+ SQLUSMALLINT second;
+ SQLUINTEGER fraction;[b]
+ } TIMESTAMP_STRUCT;[a]
+SQL_C_NUMERIC SQL_NUMERIC_STRUCT struct tagSQL_NUMERIC_STRUCT {
+ SQLCHAR precision;
+ SQLSCHAR scale;
+ SQLCHAR sign[g];
+ SQLCHAR
+ val
+ [SQL_MAX_NUMERIC_L EN];
+ [e], [f]
+ } SQL_NUMERIC_STRUCT;
+SQL_C_GUID SQLGUID struct tagSQLGUID {
+ DWORD Data1;
+ WORD Data2;
+ WORD Data3;
+ BYTE Data4[8];
+ } SQLGUID;[k]
+All C interval data SQL_INTERVAL_STRUCT See the "_C_ _I_n_t_e_r_v_a_l_ _S_t_r_u_c_t_u_r_e"
+types section, later in this appendix.
+[a] The values of the year, month, day, hour, minute, and second fields in
+the datetime C data types must conform to the constraints of the Gregorian
+calendar. (See "_C_o_n_s_t_r_a_i_n_t_s_ _o_f_ _t_h_e_ _G_r_e_g_o_r_i_a_n_ _C_a_l_e_n_d_a_r" later in this appendix.)
+[b] The value of the fraction field is the number of billionths of a second
+and ranges from 0 through 999,999,999 (1 less than 1 billion). For example, the
+value of the fraction field for a half-second is 500,000,000, for a thousandth
+of a second (one millisecond) is 1,000,000, for a millionth of a second (one
+microsecond) is 1,000, and for a billionth of a second (one nanosecond) is 1.
+[c] In ODBC 2.x, the C date, time, and timestamp data types are SQL_C_DATE,
+SQL_C_TIME, and SQL_C_TIMESTAMP.
+[d] ODBC 3.x applications should use SQL_C_VARBOOKMARK, not SQL_C_BOOKMARK.
+When an ODBC 3.x application works with an ODBC 2.x driver, the ODBC 3.x Driver
+Manager will map SQL_C_VARBOOKMARK to SQL_C_BOOKMARK.
+[e] A number is stored in the val field of the SQL_NUMERIC_STRUCT structure
+as a scaled integer, in little endian mode (the leftmost byte being the least-
+significant byte). For example, the number 10.001 base 10, with a scale of 4,
+is scaled to an integer of 100010. Because this is 186AA in hexadecimal format,
+the value in SQL_NUMERIC_STRUCT would be "AA 86 01 00 00 … 00", with the number
+of bytes defined by the SQL_MAX_NUMERIC_LEN ##ddeeffiinnee.
+[f] The precision and scale fields of the SQL_C_NUMERIC data type are never
+used for input from an application, only for output from the driver to the
+application. When the driver writes a numeric value into the
+SQL_NUMERIC_STRUCT, it will use its own driver-specific default as the value
+for the precision field, and it will use the value in the SQL_DESC_SCALE field
+of the application descriptor (which defaults to 0) for the scale field. An
+application can provide its own values for precision and scale by setting the
+SQL_DESC_PRECISION and SQL_DESC_SCALE fields of the application descriptor.
+[g] The sign field is 1 if positive, 0 if negative.
+[h] _int64 might not be supplied by some compilers.
+[i] _SQL_C_BOOKMARK has been deprecated in ODBC 3.x.
+[j] _SQL_C_SHORT, SQL_C_LONG, and SQL_C_TINYINT have been replaced in ODBC by
+signed and unsigned types: SQL_C_SSHORT and SQL_C_USHORT, SQL_C_SLONG and
+SQL_C_ULONG, and SQL_C_STINYINT and SQL_C_UTINYINT. An ODBC 3.x driver that
+should work with ODBC 2.x applications should support SQL_C_SHORT, SQL_C_LONG,
+and SQL_C_TINYINT, because when they are called, the Driver Manager passes them
+through to the driver.
+[k] SQL_C_GUID can be converted only to SQL_CHAR or SQL_WCHAR.