Check-in [985857de71]
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:implementing CreateMissingSystemTables()
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: 985857de716188097d97f9f407c7f1f060528c52
User & Date: sandro 2020-07-18 16:48:57
Context
2020-07-25
07:53
removing support for raster codec CharLS check-in: 95c82fa3de user: sandro tags: trunk
2020-07-18
16:48
implementing CreateMissingSystemTables() check-in: 985857de71 user: sandro tags: trunk
2020-07-14
18:51
updating spatial_ref_sys definions to Proj-.7.1 and GDAL-3.1.2 level check-in: 6ff985cfa7 user: sandro tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to spatialite-sql-latest.html.

3333
3334
3335
3336
3337
3338
3339


















3340
3341
3342
3343
3344
3345
3346
				<ul>
					<li><i>InitSpatialMetaData()</i></li>
					<li><i>InitAdvancedMetaData()</i></li>
					<li><i>CreateRasterCoveragesTable()</i></li>
					<li><i>CreateVectorCoveragesTables()</i></li>
					<li><i>CreateStylingTables()</i></li>
				</ul>the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>


















			<tr><td><b>InsertEpsgSrid</b></td>
				<td>InsertEpsgSrid( srid <i>Integer</i> ) : <i>Integer</i></td>
				<td></td>
				<td align="center" bgcolor="#d0f0d0">base</td>
				<td>Attempts to insert into <b>spatial_ref_sys</b> the EPSG definition uniquely identified by <b>srid</b><br>
				[the corresponding EPSG SRID definition will be copied from the inlined dataset defined in <b>libspatialite</b>]<hr>
the return type is Integer, with a return value of 1 for success or 0 for failure</td></tr>







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
				<ul>
					<li><i>InitSpatialMetaData()</i></li>
					<li><i>InitAdvancedMetaData()</i></li>
					<li><i>CreateRasterCoveragesTable()</i></li>
					<li><i>CreateVectorCoveragesTables()</i></li>
					<li><i>CreateStylingTables()</i></li>
				</ul>the return type is Integer, with a return value of 1 for TRUE or 0 for FALSE</td></tr>
			<tr><td><b>CreateMissingSystemTables</b></td>
				<td>CreateMissingSystemTables( void ) : <i>Integer</i><hr>
					CreateMissingSystemTables( relaxed <i>Integer</i> ) : <i>Integer</i><hr>
					CreateMissingSystemTables( relaxed <i>Integer</i> , transaction <i>Integer</i> ) : <i>Integer</i>
				<td></td>
				<td align="center" bgcolor="#d0f0d0">base</td>
				<td>This function will create any missing ancillary metadata table required by <b>libspatialite v.5</b> and subsequent versions.</v><br>
				<ul>
					<li>the <i>optional</i> argument <b>relaxed</b> has the same interpretation as in <b>CreateStylingTables()</b>:
					if it is explicitly set as <b>TRUE</b> then
					a <i>relaxed</i> version of the validating Triggers will be installed (not checking for strict <i><u>XSD schema validation</u></i>).</li>
					<li>if the <i>optional</i> argument <b>transaction</b> is explicitly set as <b>TRUE</b> then 
					the whole operation will be atomically confined within a monolithic SQL transaction</li>
				</ul>
				The return type is Integer, with a return value of 1 on success.<br>
				An exception will be raised on invalid arguments or on failure.<hr>
				<b>Note</b>: this SQL function is intended for safely upgrading
				old databases created by earlier versions; it's absolutely harmless because any existing MetaTable will be left untouched.</td></tr>
			<tr><td><b>InsertEpsgSrid</b></td>
				<td>InsertEpsgSrid( srid <i>Integer</i> ) : <i>Integer</i></td>
				<td></td>
				<td align="center" bgcolor="#d0f0d0">base</td>
				<td>Attempts to insert into <b>spatial_ref_sys</b> the EPSG definition uniquely identified by <b>srid</b><br>
				[the corresponding EPSG SRID definition will be copied from the inlined dataset defined in <b>libspatialite</b>]<hr>
the return type is Integer, with a return value of 1 for success or 0 for failure</td></tr>

Changes to src/headers/spatialite_private.h.

1472
1473
1474
1475
1476
1477
1478
1479





















































1480
1481
1482
1483
1484
#ifdef _WIN32
    SPATIALITE_PRIVATE void splite_pause_windows (void);
#else
    SPATIALITE_PRIVATE void splite_pause_signal (void);
#endif

    SPATIALITE_PRIVATE void finalize_topologies (const void *p_cache);






















































#ifdef __cplusplus
}
#endif

#endif				/* _SPATIALITE_PRIVATE_H */








>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>





1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
#ifdef _WIN32
    SPATIALITE_PRIVATE void splite_pause_windows (void);
#else
    SPATIALITE_PRIVATE void splite_pause_signal (void);
#endif

    SPATIALITE_PRIVATE void finalize_topologies (const void *p_cache);

    SPATIALITE_PRIVATE int create_data_licenses (sqlite3 * sqlite);

    SPATIALITE_PRIVATE int create_geometry_columns_time (sqlite3 * sqlite);

    SPATIALITE_PRIVATE int create_spatial_ref_sys_aux (sqlite3 * handle);

    SPATIALITE_PRIVATE int create_raster_coverages (sqlite3 * sqlite);

    SPATIALITE_PRIVATE int create_vector_coverages (sqlite3 * sqlite);

    SPATIALITE_PRIVATE int create_wms_tables (sqlite3 * sqlite);

    SPATIALITE_PRIVATE int create_external_graphics (sqlite3 * sqlite);

    SPATIALITE_PRIVATE int create_fonts (sqlite3 * sqlite);

    SPATIALITE_PRIVATE int create_raster_styles (sqlite3 * sqlite, int relaxed);

    SPATIALITE_PRIVATE int create_raster_styled_layers (sqlite3 * sqlite);

    SPATIALITE_PRIVATE int create_vector_styles (sqlite3 * sqlite, int relaxed);

    SPATIALITE_PRIVATE int create_vector_styled_layers (sqlite3 * sqlite);

    SPATIALITE_PRIVATE int create_iso_metadata (sqlite3 * sqlite, int relaxed);

    SPATIALITE_PRIVATE int create_iso_metadata_reference (sqlite3 * sqlite);

    SPATIALITE_PRIVATE int create_iso_metadata_view (sqlite3 * sqlite);

    SPATIALITE_PRIVATE int create_rl2map_configurations (sqlite3 * sqlite,
							 int relaxed);

    SPATIALITE_PRIVATE int create_rl2map_configurations_view (sqlite3 * sqlite);

    SPATIALITE_PRIVATE int create_external_graphics_view (sqlite3 * sqlite);

    SPATIALITE_PRIVATE int create_fonts_view (sqlite3 * sqlite);

    SPATIALITE_PRIVATE int create_raster_styled_layers_view (sqlite3 * sqlite);

    SPATIALITE_PRIVATE int create_raster_styles_view (sqlite3 * sqlite);

    SPATIALITE_PRIVATE int create_vector_styles_view (sqlite3 * sqlite);

    SPATIALITE_PRIVATE int create_vector_styled_layers_view (sqlite3 * sqlite);

    SPATIALITE_PRIVATE int createMissingSystemTables (sqlite3 * sqlite,
						      const void *cache,
						      int relaxed,
						      int transaction,
						      char **err_msg);

#ifdef __cplusplus
}
#endif

#endif				/* _SPATIALITE_PRIVATE_H */

Changes to src/spatialite/dbobj_scopes.c.

2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
....
2287
2288
2289
2290
2291
2292
2293
2294

2295
2296
2297
2298
2299
2300
2301
    if (strcasecmp (tbl_name, "geom_cols_ref_sys") == 0)
      {
	  *sys_scope = sqlite3_mprintf ("CRS Catalog");
	  return 1;
      }
    if (strcasecmp (tbl_name, "spatial_ref_sys_all") == 0)
      {
	  *sys_scope = sqlite3_mprintf ("Spatial Tables Catalog");
	  return 1;
      }
    if (strcasecmp (tbl_name, "raster_coverages_ref_sys") == 0)
      {
	  *sys_scope = sqlite3_mprintf ("Raster Coverages Catalog");
	  return 1;
      }
................................................................................
      }
    if (strcasecmp (tbl_name, "SE_external_graphics_view") == 0
	|| strcasecmp (tbl_name, "SE_fonts_view") == 0
	|| strcasecmp (tbl_name, "SE_vector_styles_view") == 0
	|| strcasecmp (tbl_name, "SE_raster_styles_view") == 0
	|| strcasecmp (tbl_name, "SE_vector_styled_layers_view") == 0
	|| strcasecmp (tbl_name, "SE_raster_styled_layers_view") == 0
	|| strcasecmp (tbl_name, "rl2map_configurations") == 0)

      {
	  *sys_scope = sqlite3_mprintf ("SLD/SE Styling");
	  return 1;
      }
    if (strcasecmp (tbl_name, "ISO_metadata_view") == 0)
      {
	  *sys_scope = sqlite3_mprintf ("ISO Metadata Component");







|







 







|
>







2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
....
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
    if (strcasecmp (tbl_name, "geom_cols_ref_sys") == 0)
      {
	  *sys_scope = sqlite3_mprintf ("CRS Catalog");
	  return 1;
      }
    if (strcasecmp (tbl_name, "spatial_ref_sys_all") == 0)
      {
	  *sys_scope = sqlite3_mprintf ("CRS Catalog");
	  return 1;
      }
    if (strcasecmp (tbl_name, "raster_coverages_ref_sys") == 0)
      {
	  *sys_scope = sqlite3_mprintf ("Raster Coverages Catalog");
	  return 1;
      }
................................................................................
      }
    if (strcasecmp (tbl_name, "SE_external_graphics_view") == 0
	|| strcasecmp (tbl_name, "SE_fonts_view") == 0
	|| strcasecmp (tbl_name, "SE_vector_styles_view") == 0
	|| strcasecmp (tbl_name, "SE_raster_styles_view") == 0
	|| strcasecmp (tbl_name, "SE_vector_styled_layers_view") == 0
	|| strcasecmp (tbl_name, "SE_raster_styled_layers_view") == 0
	|| strcasecmp (tbl_name, "rl2map_configurations") == 0
	|| strcasecmp (tbl_name, "rl2map_configurations_view") == 0)
      {
	  *sys_scope = sqlite3_mprintf ("SLD/SE Styling");
	  return 1;
      }
    if (strcasecmp (tbl_name, "ISO_metadata_view") == 0)
      {
	  *sys_scope = sqlite3_mprintf ("ISO Metadata Component");

Changes to src/spatialite/extra_tables.c.

65
66
67
68
69
70
71

72
73
74
75
76
77
78
...
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
...
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
...
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
...
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
....
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
....
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061

1062
1063
1064
1065
1066
1067
1068
1069
....
1073
1074
1075
1076
1077
1078
1079

1080
1081
1082
1083
1084
1085
1086
1087
....
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283

1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295

1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308

1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320

1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332

1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346

1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359

1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371

1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383

1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395

1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407

1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420

1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433

1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445

1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457

1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469

1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481

1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493

1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505

1506
1507
1508
1509
1510
1511
1512
1513
....
1514
1515
1516
1517
1518
1519
1520

1521
1522
1523
1524
1525
1526
1527
1528
....
1529
1530
1531
1532
1533
1534
1535

1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547

1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559

1560
1561
1562
1563
1564
1565
1566
1567
....
1571
1572
1573
1574
1575
1576
1577

1578
1579
1580
1581
1582
1583
1584
1585
....
1589
1590
1591
1592
1593
1594
1595

1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607

1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619

1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631

1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643

1644
1645
1646
1647
1648
1649
1650
1651
....
1659
1660
1661
1662
1663
1664
1665

1666
1667
1668
1669
1670
1671
1672
1673
....
1681
1682
1683
1684
1685
1686
1687

1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699

1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711

1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724

1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737

1738
1739
1740
1741
1742
1743
1744
1745
....
1748
1749
1750
1751
1752
1753
1754

1755
1756
1757
1758
1759
1760
1761
1762
....
1765
1766
1767
1768
1769
1770
1771

1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783

1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
....
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
....
1852
1853
1854
1855
1856
1857
1858

1859
1860
1861
1862
1863
1864
1865
1866
....
1870
1871
1872
1873
1874
1875
1876

1877
1878
1879
1880
1881
1882
1883
1884
....
1893
1894
1895
1896
1897
1898
1899

1900
1901
1902
1903
1904
1905
1906
1907
....
1911
1912
1913
1914
1915
1916
1917

1918
1919
1920
1921
1922
1923
1924
1925
....
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
....
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
....
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
....
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
....
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
....
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
....
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
....
2614
2615
2616
2617
2618
2619
2620

2621
2622
2623
2624
2625
2626
2627
2628
....
2632
2633
2634
2635
2636
2637
2638

2639
2640
2641
2642
2643
2644
2645
2646
....
2655
2656
2657
2658
2659
2660
2661

2662
2663
2664
2665
2666
2667
2668
2669
....
2673
2674
2675
2676
2677
2678
2679

2680
2681
2682
2683
2684
2685
2686
2687
....
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
....
2745
2746
2747
2748
2749
2750
2751

2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
....
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
....
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
....
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
....
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
....
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
....
3175
3176
3177
3178
3179
3180
3181

3182
3183
3184
3185
3186
3187
3188
3189
....
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
....
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
....
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
....
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
....
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
....
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
....
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
....
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
....
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
....
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
....
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
....
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
....
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
....
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
....
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
....
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
....
4904
4905
4906
4907
4908
4909
4910













































































































































































#include <spatialite/sqlite.h>
#include <spatialite/debug.h>

#include <spatialite.h>
#include <spatialite_private.h>
#include <spatialite/gaiaaux.h>


#ifdef _WIN32
#define strcasecmp	_stricmp
#endif /* not WIN32 */

static int
check_splite_metacatalog (sqlite3 * sqlite)
................................................................................
	      ok_raster_coverages_keyword = 1;
      }
    sqlite3_free_table (results);

    if (ok_raster_coverages)
      {
	  /* creating the raster_coverages triggers */
	  sql = "CREATE TRIGGER raster_coverages_name_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_name_update\n"
	      "BEFORE UPDATE OF 'coverage_name' ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'update on raster_coverages violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'update on raster_coverages violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_sample_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "sample_type must be one of ''1-BIT'' | ''2-BIT'' | ''4-BIT'' | "
	      "''INT8'' | ''UINT8'' | ''INT16'' | ''UINT16'' | ''INT32'' | "
	      "''UINT32'' | ''FLOAT'' | ''DOUBLE''')\n"
	      "WHERE NEW.sample_type NOT IN ('1-BIT', '2-BIT', '4-BIT', "
	      "'INT8', 'UINT8', 'INT16', 'UINT16', 'INT32', "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_sample_update\n"
	      "BEFORE UPDATE OF 'sample_type' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "sample_type must be one of ''1-BIT'' | ''2-BIT'' | ''4-BIT'' | "
	      "''INT8'' | ''UINT8'' | ''INT16'' | ''UINT16'' | ''INT32'' | "
	      "''UINT32'' | ''FLOAT'' | ''DOUBLE''')\n"
	      "WHERE NEW.sample_type NOT IN ('1-BIT', '2-BIT', '4-BIT', "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_pixel_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "pixel_type must be one of ''MONOCHROME'' | ''PALETTE'' | "
	      "''GRAYSCALE'' | ''RGB'' | ''MULTIBAND'' | ''DATAGRID''')\n"
	      "WHERE NEW.pixel_type NOT IN ('MONOCHROME', 'PALETTE', "
	      "'GRAYSCALE', 'RGB', 'MULTIBAND', 'DATAGRID');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_pixel_update\n"
	      "BEFORE UPDATE OF 'pixel_type' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "pixel_type must be one of ''MONOCHROME'' | ''PALETTE'' | "
	      "''GRAYSCALE'' | ''RGB'' | ''MULTIBAND'' | ''DATAGRID''')\n"
	      "WHERE NEW.pixel_type NOT IN ('MONOCHROME', 'PALETTE', "
	      "'GRAYSCALE', 'RGB', 'MULTIBAND', 'DATAGRID');\nEND";
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_bands_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "num_bands must be >= 1')\nWHERE NEW.num_bands < 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_bands_update\n"
	      "BEFORE UPDATE OF 'num_bands' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "num_bands must be >= 1')\nWHERE NEW.num_bands < 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_compression_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "compression must be one of ''NONE'' | ''DEFLATE'' | ''DEFLATE_NO'' | "
	      "''LZMA'' | ''LZMA_NO'' | ''LZ4'' | ''LZ4_NO'' | ''ZSTD'' | ''ZSTD_NO'' | "
	      "''PNG'' | ''JPEG'' | ''LOSSY_WEBP'' | ''LOSSLESS_WEBP'' | ''CCITTFAX4'' | "
	      "''CHARLS'' | ''LOSSY_JP2'' | ''LOSSLESS_JP2''')\n"
	      "WHERE NEW.compression NOT IN ('NONE', 'DEFLATE',  'DEFLATE_NO', "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_compression_update\n"
	      "BEFORE UPDATE OF 'compression' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "compression must be one of ''NONE'' | ''DEFLATE'' | ''DEFLATE_NO'' | "
	      "''LZMA'' | ''LZMA_NO'' | ''LZ4'' | ''LZ4_NO'' | ''ZSTD'' | ''ZSTD_NO'' | "
	      "''PNG'' | ''JPEG'' | ''LOSSY_WEBP'' | ''LOSSLESS_WEBP'' | ''CCITTFAX4'' | "
	      "''CHARLS'' | ''LOSSY_JP2'' | ''LOSSLESS_JP2''')\n"
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_quality_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "quality must be between 0 and 100')\n"
	      "WHERE NEW.quality NOT BETWEEN 0 AND 100;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_quality_update\n"
	      "BEFORE UPDATE OF 'quality' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "quality must be between 0 and 100')\n"
	      "WHERE NEW.quality NOT BETWEEN 0 AND 100;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_tilew_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "tile_width must be an exact multiple of 8 between 256 and 1024')\n"
	      "WHERE CastToInteger(NEW.tile_width) IS NULL OR "
	      "NEW.tile_width NOT BETWEEN 256 AND 1024 OR (NEW.tile_width % 8) <> 0;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_tilew_update\n"
	      "BEFORE UPDATE OF 'tile_width' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "tile_width must be an exact multiple of 8 between 256 and 1024')\n"
	      "WHERE CastToInteger(NEW.tile_width) IS NULL OR "
	      "NEW.tile_width NOT BETWEEN 256 AND 1024 OR (NEW.tile_width % 8) <> 0;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_tileh_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "tile_height must be an exact multiple of 8 between 256 and 1024')\n"
	      "WHERE CastToInteger(NEW.tile_height) IS NULL OR "
	      "NEW.tile_height NOT BETWEEN 256 AND 1024 OR (NEW.tile_height % 8) <> 0;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_tileh_update\n"
	      "BEFORE UPDATE OF 'tile_height' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "tile_height must be an exact multiple of 8 between 256 and 1024')\n"
	      "WHERE CastToInteger(NEW.tile_height) IS NULL OR "
	      "NEW.tile_height NOT BETWEEN 256 AND 1024 OR (NEW.tile_height % 8) <> 0;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_horzres_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "horz_resolution must be positive')\n"
	      "WHERE NEW.horz_resolution IS NOT NULL AND "
	      "(NEW.horz_resolution <= 0.0 OR CastToDouble(NEW.horz_resolution) IS NULL);\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_horzres_update\n"
	      "BEFORE UPDATE OF 'horz_resolution' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "horz_resolution must be positive')\n"
	      "WHERE NEW.horz_resolution IS NOT NULL AND "
	      "(NEW.horz_resolution <= 0.0 OR CastToDouble(NEW.horz_resolution) IS NULL);\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_vertres_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "vert_resolution must be positive')\n"
	      "WHERE NEW.vert_resolution IS NOT NULL AND "
	      "(NEW.vert_resolution <= 0.0 OR CastToDouble(NEW.vert_resolution) IS NULL);\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_vertres_update\n"
	      "BEFORE UPDATE OF 'vert_resolution' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "vert_resolution must be positive')\n"
	      "WHERE NEW.vert_resolution IS NOT NULL AND "
	      "(NEW.vert_resolution <= 0.0 OR CastToDouble(NEW.vert_resolution) IS NULL);\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_nodata_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "invalid nodata_pixel')\nWHERE NEW.nodata_pixel IS NOT NULL AND "
	      "IsValidPixel(NEW.nodata_pixel, NEW.sample_type, NEW.num_bands) <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_nodata_update\n"
	      "BEFORE UPDATE OF 'nodata_pixel' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "invalid nodata_pixel')\nWHERE NEW.nodata_pixel IS NOT NULL AND "
	      "IsValidPixel(NEW.nodata_pixel, NEW.sample_type, NEW.num_bands) <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_palette_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "invalid palette')\nWHERE NEW.palette IS NOT NULL AND "
	      "(NEW.pixel_type <> 'PALETTE' OR NEW.num_bands <> 1 OR "
	      "IsValidRasterPalette(NEW.palette, NEW.sample_type) <> 1);\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_palette_update\n"
	      "BEFORE UPDATE OF 'palette' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "invalid palette')\nWHERE NEW.palette IS NOT NULL AND "
	      "(NEW.pixel_type <> 'PALETTE' OR NEW.num_bands <> 1 OR "
	      "IsValidRasterPalette(NEW.palette, NEW.sample_type) <> 1);\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_statistics_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "invalid statistics')\nWHERE NEW.statistics IS NOT NULL AND "
	      "IsValidRasterStatistics(NEW.statistics, NEW.sample_type, NEW.num_bands) <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_statistics_update\n"
	      "BEFORE UPDATE OF 'statistics' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "invalid statistics')\nWHERE NEW.statistics IS NOT NULL AND "
	      "IsValidRasterStatistics(NEW.statistics, NEW.sample_type, NEW.num_bands) <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_monosample_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent MONOCHROME sample_type')\nWHERE NEW.pixel_type = 'MONOCHROME' "
	      "AND NEW.sample_type <> '1-BIT';\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_monosample_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent MONOCHROME sample_type')\nWHERE NEW.pixel_type = 'MONOCHROME' "
	      "AND NEW.sample_type <>'1-BIT';\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_monocompr_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent MONOCHROME compression')\nWHERE NEW.pixel_type = 'MONOCHROME' "
	      "AND NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', "
	      "'LZMA_NO', 'LZ4', 'LZ4_NO', 'ZSTD', 'ZSTD_NO', 'PNG', "
	      "'CCITTFAX4');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_monocompr_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent MONOCHROME compression')\nWHERE NEW.pixel_type = 'MONOCHROME' "
	      "AND NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', "
	      "'LZMA_NO', 'LZ4', 'LZ4_NO', 'ZSTD', 'ZSTD_NO', 'PNG', 'CCITTFAX4');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_monobands_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent MONOCHROME num_bands')\nWHERE NEW.pixel_type = 'MONOCHROME' "
	      "AND NEW.num_bands <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_monobands_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent MONOCHROME num_bands')\nWHERE NEW.pixel_type = 'MONOCHROME' "
	      "AND NEW.num_bands <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_pltsample_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent PALETTE sample_type')\nWHERE NEW.pixel_type = 'PALETTE' "
	      "AND NEW.sample_type NOT IN ('1-BIT', '2-BIT', '4-BIT', 'UINT8');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_pltsample_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent PALETTE sample_type')\nWHERE NEW.pixel_type = 'PALETTE' "
	      "AND NEW.sample_type NOT IN ('1-BIT', '2-BIT', '4-BIT', 'UINT8');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_pltcompr_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent PALETTE compression')\nWHERE NEW.pixel_type = 'PALETTE' "
	      "AND NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', "
	      "'LZMA_NO', 'LZ4', 'LZ4_NO', 'ZSTD', 'ZSTD_NO', 'PNG');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_pltcompr_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent PALETTE compression')\nWHERE NEW.pixel_type = 'PALETTE' "
	      "AND NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', "
	      "'LZMA_NO', 'LZ4', 'LZ4_NO', 'ZSTD', 'ZSTD_NO', 'PNG');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_pltbands_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent PALETTE num_bands')\nWHERE NEW.pixel_type = 'PALETTE' "
	      "AND NEW.num_bands <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_pltbands_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent PALETTE num_bands')\nWHERE NEW.pixel_type = 'PALETTE' "
	      "AND NEW.num_bands <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_graysample_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent GRAYSCALE sample_type')\nWHERE NEW.pixel_type = 'GRAYSCALE' "
	      "AND NEW.sample_type NOT IN ('2-BIT', '4-BIT', 'UINT8');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_graysample_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent GRAYSCALE sample_type')\nWHERE NEW.pixel_type = 'GRAYSCALE' "
	      "AND NEW.sample_type NOT IN ('2-BIT', '4-BIT', 'UINT8');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_graybands_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent GRAYSCALE num_bands')\nWHERE NEW.pixel_type = 'GRAYSCALE' "
	      "AND NEW.num_bands <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_graybands_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent GRAYSCALE num_bands')\nWHERE NEW.pixel_type = 'GRAYSCALE' "
	      "AND NEW.num_bands <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_graycompr_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent GRAYSCALE compression')\nWHERE NEW.pixel_type = "
	      "'GRAYSCALE' AND NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', "
	      "'LZMA', 'LZMA_NO', 'LZ4', 'LZ4_NO', 'ZSTD', 'ZSTD_NO', 'PNG', "
	      "'JPEG', 'LOSSY_WEBP', 'LOSSLESS_WEBP', 'CHARLS', 'LOSSY_JP2', "
	      "'LOSSLESS_JP2');\nEND";
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_graycompr_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent GRAYSCALE compression')\nWHERE NEW.pixel_type = "
	      "'GRAYSCALE' AND NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', "
	      "'LZMA', 'LZMA_NO', 'LZ4', 'LZ4_NO', 'ZSTD', 'ZSTD_NO', 'PNG', "
	      "'JPEG', 'LOSSY_WEBP', 'LOSSLESS_WEBP', 'CHARLS', 'LOSSY_JP2', "
	      "'LOSSLESS_JP2');\nEND";
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_rgbsample_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent RGB sample_type')\nWHERE NEW.pixel_type = 'RGB' "
	      "AND NEW.sample_type NOT IN ('UINT8', 'UINT16');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_rgbsample_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent RGB sample_type')\nWHERE NEW.pixel_type = 'RGB' "
	      "AND NEW.sample_type NOT IN ('UINT8', 'UINT16');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_rgbcompr_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent RGB compression')\nWHERE NEW.pixel_type = 'RGB' "
	      "AND ((NEW.sample_type = 'UINT8' AND NEW.compression NOT IN ("
	      "'NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', 'LZMA_NO', 'LZ4', 'LZ4_NO', "
	      "'ZSTD', 'ZSTD_NO', 'PNG', 'JPEG', 'LOSSY_WEBP', 'LOSSLESS_WEBP', "
	      "'CHARLS', 'LOSSY_JP2', 'LOSSLESS_JP2') OR (NEW.sample_type = "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_rgbcompr_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent RGB compression')\nWHERE NEW.pixel_type = 'RGB' "
	      "AND ((NEW.sample_type = 'UINT8' AND NEW.compression NOT IN ("
	      "'NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', 'LZMA_NO', 'LZ4', 'LZ4_NO', "
	      "'ZSTD', 'ZSTD_NO', 'PNG', 'JPEG', 'LOSSY_WEBP', 'LOSSLESS_WEBP', "
	      "'CHARLS', 'LOSSY_JP2', 'LOSSLESS_JP2') OR (NEW.sample_type = "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_rgbbands_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent RGB num_bands')\nWHERE NEW.pixel_type = 'RGB' "
	      "AND NEW.num_bands <> 3;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_rgbbands_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent RGB num_bands')\nWHERE NEW.pixel_type = 'RGB' "
	      "AND NEW.num_bands <> 3;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_multisample_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent MULTIBAND sample_type')\nWHERE NEW.pixel_type = 'MULTIBAND' "
	      "AND NEW.sample_type NOT IN ('UINT8', 'UINT16');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_multisample_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent MULTIBAND sample_type')\nWHERE NEW.pixel_type = 'MULTIBAND' "
	      "AND NEW.sample_type NOT IN ('UINT8', 'UINT16');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_multicompr_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent MULTIBAND compression')\nWHERE NEW.pixel_type = "
	      "'MULTIBAND' AND ((NEW.num_bands NOT IN (3, 4) AND "
	      "NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', "
	      "'LZMA_NO', 'LZ4', 'LZ4_NO', 'ZSTD', 'ZSTD_NO')) OR	"
	      "(NEW.sample_type <> 'UINT16' AND NEW.num_bands IN (3, 4) AND "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_multicompr_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent MULTIBAND compression')\nWHERE NEW.pixel_type = "
	      "'MULTIBAND' AND ((NEW.num_bands NOT IN (3, 4) AND "
	      "NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', "
	      "'LZMA_NO', 'LZ4', 'LZ4_NO', 'ZSTD', 'ZSTD_NO')) OR	"
	      "(NEW.sample_type <> 'UINT16' AND NEW.num_bands IN (3, 4) AND "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_multibands_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent MULTIBAND num_bands')\nWHERE NEW.pixel_type = 'MULTIBAND' "
	      "AND NEW.num_bands < 2;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_multibands_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent MULTIBAND num_bands')\nWHERE NEW.pixel_type = 'MULTIBAND' "
	      "AND NEW.num_bands < 2;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_gridsample_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent DATAGRID sample_type')\nWHERE NEW.pixel_type = 'DATAGRID' "
	      "AND NEW.sample_type NOT IN ('INT8', 'UINT8', 'INT16', 'UINT16', "
	      "'INT32', 'UINT32', 'FLOAT', 'DOUBLE');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_gridsample_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent DATAGRID sample_type')\nWHERE NEW.pixel_type = 'DATAGRID' "
	      "AND NEW.sample_type NOT IN ('INT8', 'UINT8', 'INT16', 'UINT16', "
	      "'INT32', 'UINT32', 'FLOAT', 'DOUBLE');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_gridcompr_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent DATAGRID compression')\nWHERE NEW.pixel_type = 'DATAGRID' "
	      "AND (((NEW.sample_type NOT IN ('UINT8', 'UINT16')) AND NEW.compression "
	      "NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', 'LZMA_NO', 'LZ4', "
	      "'LZ4_NO', 'ZSTD', 'ZSTD_NO')) OR ((NEW.sample_type IN ('UINT8', 'UINT16')) "
	      "AND NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_gridcompr_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent DATAGRID compression')\nWHERE NEW.pixel_type = 'DATAGRID' "
	      "AND (((NEW.sample_type NOT IN ('UINT8', 'UINT16')) AND NEW.compression "
	      "NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', 'LZMA_NO', 'LZ4', "
	      "'LZ4_NO', 'ZSTD', 'ZSTD_NO')) OR ((NEW.sample_type IN ('UINT8', 'UINT16')) "
	      "AND NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_gridbands_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent DATAGRID num_bands')\nWHERE NEW.pixel_type = 'DATAGRID' "
	      "AND NEW.num_bands <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_gridbands_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent DATAGRID num_bands')\nWHERE NEW.pixel_type = 'DATAGRID' "
	      "AND NEW.num_bands <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_georef_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent georeferencing infos')\n"
	      "WHERE NOT ((NEW.horz_resolution IS NULL AND NEW.vert_resolution IS NULL "
	      "AND NEW.srid IS NULL) OR (NEW.horz_resolution IS NOT NULL "
	      "AND NEW.vert_resolution IS NOT NULL AND NEW.srid IS NOT NULL));\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_georef_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'update on raster_coverages violates constraint: "
	      "inconsistent georeferencing infos')\n"
	      "WHERE NOT ((NEW.horz_resolution IS NULL AND NEW.vert_resolution IS NULL "
	      "AND NEW.srid IS NULL) OR (NEW.horz_resolution IS NOT NULL "
	      "AND NEW.vert_resolution IS NOT NULL AND NEW.srid IS NOT NULL));\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "attempting to change the definition of an already populated Coverage')\n"
	      "WHERE IsPopulatedCoverage(NULL, OLD.coverage_name) = 1 AND "
	      "((OLD.sample_type <> NEW.sample_type) AND (OLD.pixel_type <> NEW.sample_type) "
	      "OR (OLD.num_bands <> NEW.num_bands) OR (OLD.compression <> NEW.compression) "
	      "OR (OLD.quality <> NEW.quality) OR (OLD.tile_width <> NEW.tile_width) "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER raster_coverages_delete\n"
	      "BEFORE DELETE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'delete on raster_coverages violates constraint: "
	      "attempting to delete the definition of an already populated Coverage')\n"
	      "WHERE IsPopulatedCoverage(NULL, OLD.coverage_name) = 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
................................................................................
		return 0;
	    }
      }

    if (ok_raster_coverages_srid)
      {
	  /* creating the raster_coverages_srid triggers */

	  sql = "CREATE TRIGGER raster_coverages_srid_name_insert\n"
	      "BEFORE INSERT ON 'raster_coverages_srid'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages_srid violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages_srid violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_srid_name_update\n"
	      "BEFORE UPDATE OF 'coverage_name' ON 'raster_coverages_srid'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'update on raster_coverages_srid violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'update on raster_coverages_srid violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
		return 0;
	    }
      }

    if (ok_raster_coverages_keyword)
      {
	  /* creating the raster_coverages_keyword triggers */

	  sql = "CREATE TRIGGER raster_coverages_keyword_name_insert\n"
	      "BEFORE INSERT ON 'raster_coverages_keyword'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages_keyword violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages_keyword violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER raster_coverages_keyword_name_update\n"
	      "BEFORE UPDATE OF 'coverage_name' ON 'raster_coverages_keyword'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'update on raster_coverages_keyword violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'update on raster_coverages_keyword violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
		sqlite3_free (err_msg);
		return 0;
	    }
      }
    return 1;
}

static int
create_raster_coverages (sqlite3 * sqlite)
{
/* creating the "raster_coverages" table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE raster_coverages (\n"
	"coverage_name TEXT NOT NULL PRIMARY KEY,\n"
	"title TEXT NOT NULL DEFAULT '*** missing Title ***',\n"
	"abstract TEXT NOT NULL DEFAULT '*** missing Abstract ***',\n"
	"sample_type TEXT NOT NULL DEFAULT '*** undefined ***',\n"
	"pixel_type TEXT NOT NULL DEFAULT '*** undefined ***',\n"
	"num_bands INTEGER NOT NULL DEFAULT 1,\n"
	"compression TEXT NOT NULL DEFAULT 'NONE',\n"
................................................................................
      {
	  spatialite_e ("CREATE TABLE 'raster_coverages' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

/* creating the raster_coverages_srid table */
    sql = "CREATE TABLE raster_coverages_srid (\n"
	"coverage_name TEXT NOT NULL,\n"
	"srid INTEGER NOT NULL,\n"
	"extent_minx DOUBLE,\n"
	"extent_miny DOUBLE,\n"
	"extent_maxx DOUBLE,\n"
	"extent_maxy DOUBLE,\n"
	"CONSTRAINT pk_raster_coverages_srid PRIMARY KEY (coverage_name, srid),\n"
................................................................................
	  spatialite_e ("CREATE TABLE 'raster_coverages_srid' error: %s\n",
			err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

/* creating the raster_coverages_ref_sys view */
    sql = "CREATE VIEW raster_coverages_ref_sys AS\n"
	"SELECT c.coverage_name AS coverage_name, c.title AS title, "
	"c.abstract AS abstract, c.sample_type AS sample_type, "
	"c.pixel_type AS pixel_type, c.num_bands AS num_bands, "
	"c.compression AS compression, c.quality AS quality, "
	"c.tile_width AS tile_width, c.tile_height AS tile_height, "
	"c.horz_resolution AS horz_resolution, c.vert_resolution AS vert_resolution, "
	"c.nodata_pixel AS nodata_pixel, c.palette AS palette, "
................................................................................
	  spatialite_e ("CREATE VIEW 'raster_coverages_ref_sys' error: %s\n",
			err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

/* creating the raster_coverages_keyword table */
    sql = "CREATE TABLE raster_coverages_keyword (\n"
	"coverage_name TEXT NOT NULL,\n"
	"keyword TEXT NOT NULL,\n"
	"CONSTRAINT pk_raster_coverages_keyword PRIMARY KEY (coverage_name, keyword),\n"
	"CONSTRAINT fk_raster_coverages_keyword FOREIGN KEY (coverage_name) "
	"REFERENCES raster_coverages (coverage_name) ON DELETE CASCADE)";
    ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
    if (ret != SQLITE_OK)
................................................................................
		sqlite3_free (err_msg);
		return 0;
	    }
      }
    return 1;
}

static int
create_rl2map_configurations (sqlite3 * sqlite, int relaxed)
{
/* creating the "rl2map_configurations" table */
    char *sql;
    int ret;
    char *err_msg = NULL;

................................................................................
	      ok_vector_coverages_keyword = 1;
      }
    sqlite3_free_table (results);

    if (ok_vector_coverages)
      {
	  /* creating the vector_coverages triggers */
	  sql = "CREATE TRIGGER vector_coverages_name_insert\n"
	      "BEFORE INSERT ON 'vector_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on vector_coverages violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'insert on vector_coverages violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER vector_coverages_name_update\n"
	      "BEFORE UPDATE OF 'coverage_name' ON 'vector_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'update on vector_coverages violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'update on vector_coverages violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
		return 0;
	    }
      }

    if (ok_vector_coverages_srid)
      {
	  /* creating the vector_coverages_srid triggers */

	  sql = "CREATE TRIGGER vector_coverages_srid_name_insert\n"
	      "BEFORE INSERT ON 'vector_coverages_srid'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on vector_coverages_srid violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'insert on vector_coverages_srid violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER vector_coverages_srid_name_update\n"
	      "BEFORE UPDATE OF 'coverage_name' ON 'vector_coverages_srid'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'update on vector_coverages_srid violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'update on vector_coverages_srid violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
		return 0;
	    }
      }

    if (ok_vector_coverages_keyword)
      {
	  /* creating the vector_coverages_keyword triggers */

	  sql = "CREATE TRIGGER vector_coverages_keyword_name_insert\n"
	      "BEFORE INSERT ON 'vector_coverages_keyword'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on vector_coverages_keyword violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'insert on vector_coverages_keyword violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }

	  sql = "CREATE TRIGGER vector_coverages_keyword_name_update\n"
	      "BEFORE UPDATE OF 'coverage_name' ON 'vector_coverages_keyword'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'update on vector_coverages_keyword violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'update on vector_coverages_keyword violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
		sqlite3_free (err_msg);
		return 0;
	    }
      }
    return 1;
}

static int
create_vector_coverages (sqlite3 * sqlite)
{
/* creating the "vector_coverages" table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE vector_coverages (\n"
	"coverage_name TEXT NOT NULL PRIMARY KEY,\n"
	"f_table_name TEXT,\n"
	"f_geometry_column TEXT,\n"
	"view_name TEXT,\n"
	"view_geometry TEXT,\n"
	"virt_name TEXT,\n"
	"virt_geometry TEXT,\n"
................................................................................
    if (ret != SQLITE_OK)
      {
	  spatialite_e ("CREATE TABLE 'vector_coverages' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
/* creating the VectorLayers index */

    sql = "CREATE UNIQUE INDEX idx_vector_coverages ON vector_coverages "
	"(f_table_name, f_geometry_column)";
    ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
    if (ret != SQLITE_OK)
      {
	  spatialite_e ("CREATE INDEX 'idx_vector_coverages' error: %s\n",
			err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

/* creating the vector_coverages_srid table */
    sql = "CREATE TABLE vector_coverages_srid (\n"
	"coverage_name TEXT NOT NULL,\n"
	"srid INTEGER NOT NULL,\n"
	"extent_minx DOUBLE,\n"
	"extent_miny DOUBLE,\n"
	"extent_maxx DOUBLE,\n"
	"extent_maxy DOUBLE,\n"
	"CONSTRAINT pk_vector_coverages_srid PRIMARY KEY (coverage_name, srid),\n"
................................................................................
	  spatialite_e ("CREATE TABLE 'vector_coverages_srid' error: %s\n",
			err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

/* creating the vector_coverages_ref_sys view */
    sql = "CREATE VIEW vector_coverages_ref_sys AS\n"
	"SELECT v.coverage_name AS coverage_name, v.title AS title, v.abstract AS abstract, "
	"v.is_queryable AS is_queryable, v.geo_minx AS geo_minx, v.geo_miny AS geo_miny, "
	"v.geo_maxx AS geo_maxx, v.geo_maxy AS geo_maxy, v.extent_minx AS extent_minx, "
	"v.extent_miny AS extent_miny, v.extent_maxx AS extent_maxx, v.extent_maxy AS extent_maxy, "
	"s.srid AS srid, 1 AS native_srid, s.auth_name AS auth_name, s.auth_srid AS auth_srid, "
	"s.ref_sys_name AS ref_sys_name, s.proj4text AS proj4text\n"
	"FROM vector_coverages AS v\n"
................................................................................
	  spatialite_e ("CREATE VIEW 'vector_coverages_ref_sys' error: %s\n",
			err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

/* creating the vector_coverages_keyword table */
    sql = "CREATE TABLE vector_coverages_keyword (\n"
	"coverage_name TEXT NOT NULL,\n"
	"keyword TEXT NOT NULL,\n"
	"CONSTRAINT pk_vector_coverages_keyword PRIMARY KEY (coverage_name, keyword),\n"
	"CONSTRAINT fk_vector_coverages_keyword FOREIGN KEY (coverage_name) "
	"REFERENCES vector_coverages (coverage_name) ON DELETE CASCADE)";
    ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
    if (ret != SQLITE_OK)
................................................................................
      }
    for (i = 1; i <= rows; i++)
	exists = 1;
    sqlite3_free_table (results);
    return exists;
}

static int
create_wms_tables (sqlite3 * sqlite)
{
/* creating the WMS support tables */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE wms_getcapabilities (\n"
	"id INTEGER PRIMARY KEY AUTOINCREMENT,\n"
	"url TEXT NOT NULL,\n"
	"title TEXT NOT NULL DEFAULT '*** undefined ***',\n"
	"abstract TEXT NOT NULL DEFAULT '*** undefined ***')";
    ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
    if (ret != SQLITE_OK)
      {
	  spatialite_e ("CREATE TABLE 'wms_getcapabilities' error: %s\n",
			err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    sql =
	"CREATE UNIQUE INDEX idx_wms_getcapabilities ON wms_getcapabilities (url)";
    ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
    if (ret != SQLITE_OK)
      {
	  spatialite_e ("CREATE INDEX 'idx_wms_getcapabilities' error: %s\n",
			err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

    sql = "CREATE TABLE wms_getmap (\n"
	"id INTEGER PRIMARY KEY AUTOINCREMENT,\n"
	"parent_id INTEGER NOT NULL,\n"
	"url TEXT NOT NULL,\n"
	"layer_name TEXT NOT NULL,\n"
	"title TEXT NOT NULL DEFAULT '*** undefined ***',\n"
	"abstract TEXT NOT NULL DEFAULT '*** undefined ***',\n"
	"version TEXT NOT NULL,\n"
................................................................................
    if (ret != SQLITE_OK)
      {
	  spatialite_e ("CREATE INDEX 'idx_wms_getmap' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

    sql = "CREATE TABLE wms_settings (\n"
	"id INTEGER PRIMARY KEY AUTOINCREMENT,\n"
	"parent_id INTEGER NOT NULL,\n"
	"key TEXT NOT NULL CHECK (Lower(key) IN ('version', 'format', 'style')),\n"
	"value TEXT NOT NULL,\n"
	"is_default INTEGER NOT NULL CHECK (is_default IN (0, 1)),\n"
	"CONSTRAINT fk_wms_settings FOREIGN KEY (parent_id) "
	"REFERENCES wms_getmap (id) ON DELETE CASCADE)";
................................................................................
    if (ret != SQLITE_OK)
      {
	  spatialite_e ("CREATE INDEX 'idx_wms_settings' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

    sql = "CREATE TABLE wms_ref_sys (\n"
	"id INTEGER PRIMARY KEY AUTOINCREMENT,\n"
	"parent_id INTEGER NOT NULL,\n"
	"srs TEXT NOT NULL,\n"
	"minx DOUBLE NOT NULL,\n"
	"miny DOUBLE NOT NULL,\n"
	"maxx DOUBLE NOT NULL,\n"
	"maxy DOUBLE NOT NULL,\n"
................................................................................
    ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
    if (ret != SQLITE_OK)
      {
	  spatialite_e ("CREATE TABLE 'wms_ref_sys' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

    sql = "CREATE UNIQUE INDEX idx_wms_ref_sys ON wms_ref_sys (parent_id, srs)";
    ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
    if (ret != SQLITE_OK)
      {
	  spatialite_e ("CREATE INDEX 'idx_wms_ref_sys' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
................................................................................
		sqlite3_free (err_msg);
		return 0;
	    }
      }
    return 1;
}

static int
create_external_graphics (sqlite3 * sqlite)
{
/* creating the SE_external_graphics table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE SE_external_graphics (\n"
................................................................................
		sqlite3_free (err_msg);
		return 0;
	    }
      }
    return 1;
}

static int
create_fonts (sqlite3 * sqlite)
{
/* creating the SE_fonts table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE SE_fonts (\n"
................................................................................
		sqlite3_free (err_msg);
		return 0;
	    }
      }
    return 1;
}

static int
create_vector_styles (sqlite3 * sqlite, int relaxed)
{
/* creating the SE_vector_styles table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE SE_vector_styles (\n"
................................................................................
		sqlite3_free (err_msg);
		return 0;
	    }
      }
    return 1;
}

static int
create_vector_styled_layers (sqlite3 * sqlite)
{
/* creating the SE_vector_styled_layers table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE SE_vector_styled_layers (\n"
................................................................................
		sqlite3_free (err_msg);
		return 0;
	    }
      }
    return 1;
}

static int
create_raster_styles (sqlite3 * sqlite, int relaxed)
{
/* creating the SE_raster_styles table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE SE_raster_styles (\n"
................................................................................
		sqlite3_free (err_msg);
		return 0;
	    }
      }
    return 1;
}

static int
create_raster_styled_layers (sqlite3 * sqlite)
{
/* creating the SE_raster_styled_layers table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE SE_raster_styled_layers (\n"
................................................................................
	  return 0;
      }
    if (!create_raster_styled_layers_triggers (sqlite))
	return 0;
    return 1;
}

static int
create_external_graphics_view (sqlite3 * sqlite)
{
/* creating the SE_external_graphics_view view */
    char *sql_statement;
    int ret;
    char *err_msg = NULL;
    sql_statement =
................................................................................
	      ("CREATE VIEW 'SE_external_graphics_view' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    return 1;
}

static int
create_fonts_view (sqlite3 * sqlite)
{
/* creating the SE_fonts_view view */
    char *sql_statement;
    int ret;
    char *err_msg = NULL;
    sql_statement =
................................................................................
	  spatialite_e ("CREATE VIEW 'SE_fonts_view' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    return 1;
}

static int
create_vector_styles_view (sqlite3 * sqlite)
{
/* creating the SE_vector_styles_view view */
    char *sql_statement;
    int ret;
    char *err_msg = NULL;
    sql_statement =
................................................................................
	      ("CREATE VIEW 'SE_vector_styles_view' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    return 1;
}

static int
create_raster_styles_view (sqlite3 * sqlite)
{
/* creating the SE_raster_styles_view view */
    char *sql_statement;
    int ret;
    char *err_msg = NULL;
    sql_statement =
................................................................................
	      ("CREATE VIEW 'SE_raster_styles_view' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    return 1;
}

static int
create_rl2map_configurations_view (sqlite3 * sqlite)
{
/* creating the rl2map_configurations_view view */
    char *sql_statement;
    int ret;
    char *err_msg = NULL;
    sql_statement =
................................................................................
	      ("CREATE VIEW 'rl2map_configurations_view' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    return 1;
}

static int
create_vector_styled_layers_view (sqlite3 * sqlite)
{
/* creating the SE_vector_styled_layers_view view */
    char *sql_statement;
    int ret;
    char *err_msg = NULL;
    sql_statement =
................................................................................
	      ("SELECT SE_AutoRegisterStandardBrushes() error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    return 1;
}

static int
create_raster_styled_layers_view (sqlite3 * sqlite)
{
/* creating the SE_raster_styled_layers_view view */
    char *sql_statement;
    int ret;
    char *err_msg = NULL;
    sql_statement =
................................................................................
      }
    for (i = 1; i <= rows; i++)
	exists = 1;
    sqlite3_free_table (results);
    return exists;
}

static int
create_iso_metadata (sqlite3 * sqlite, int relaxed)
{
/* creating the ISO_metadata table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE ISO_metadata (\n"
................................................................................
			err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    return 1;
}

static int
create_iso_metadata_reference (sqlite3 * sqlite)
{
/* creating the ISO_metadata_reference table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE ISO_metadata_reference (\n"
................................................................................
	       err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    return 1;
}

static int
create_iso_metadata_view (sqlite3 * sqlite)
{
/* creating the ISO_metadata_view view */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE VIEW ISO_metadata_view AS\n"
................................................................................
    return 1;

  error:
    return 0;
}

#endif /* end including LIBXML2 */



















































































































































































>







 







|







 







|







 







|







 







|







 







|













|







 







|










|











>
|







 







>
|







 







|











|












|












|













|












|













|












|













|












|













|











|












|












|













>
|











>
|












>
|











>
|











>
|













>
|












>
|











>
|











>
|











>
|











>
|












>
|












>
|











>
|











>
|











>
|











>
|











>
|











>
|







 







>
|







 







>
|











>
|











>
|







 







>
|







 







>
|











>
|











>
|











>
|











>
|







 







>
|







 







>
|











>
|











>
|












>
|












>
|







 







>
|







 







>
|











>
|











|













|













|







 







|







 







>
|







 







>
|







 







>
|







 







>
|







 







|






|







 







|







 







|







 







|







 







|







 







|







 







|







 







>
|







 







>
|







 







>
|







 







>
|







 







|






|







 







>
|











|







 







|







 







|







 







|






|













|









|







 







|







 







|







 







>
|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
...
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
...
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
...
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
...
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
....
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
....
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
....
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
....
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
....
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
....
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
....
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
....
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
....
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
....
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
....
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
....
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
....
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
....
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
....
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
....
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
....
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
....
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
....
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
....
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
....
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
....
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
....
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
....
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
....
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
....
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
....
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
....
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
....
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
....
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
....
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
....
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
....
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
....
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
....
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
....
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
....
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
....
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
....
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
....
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
....
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
....
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
....
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
....
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
....
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
....
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
....
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
....
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
....
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
....
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
....
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
....
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
....
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
4994
4995
4996
4997
4998
4999
5000
5001
5002
5003
5004
5005
5006
5007
5008
5009
5010
5011
5012
5013
5014
5015
5016
5017
5018
5019
5020
5021
5022
5023
5024
5025
5026
5027
5028
5029
5030
5031
5032
5033
5034
5035
5036
5037
5038
5039
5040
5041
5042
5043
5044
5045
5046
5047
5048
5049
5050
5051
5052
5053
5054
5055
5056
5057
5058
5059
5060
5061
5062
5063
5064
5065
5066
5067
5068
5069
5070
5071
5072
5073
5074
5075
5076
5077
5078
5079
5080
5081
5082
5083
5084
5085
5086
5087
5088
5089
5090
5091
5092
5093
5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
5126
5127
5128
5129
5130
5131
5132
5133

#include <spatialite/sqlite.h>
#include <spatialite/debug.h>

#include <spatialite.h>
#include <spatialite_private.h>
#include <spatialite/gaiaaux.h>
#include <spatialite/stored_procedures.h>

#ifdef _WIN32
#define strcasecmp	_stricmp
#endif /* not WIN32 */

static int
check_splite_metacatalog (sqlite3 * sqlite)
................................................................................
	      ok_raster_coverages_keyword = 1;
      }
    sqlite3_free_table (results);

    if (ok_raster_coverages)
      {
	  /* creating the raster_coverages triggers */
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_name_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_name_update\n"
	      "BEFORE UPDATE OF 'coverage_name' ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'update on raster_coverages violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'update on raster_coverages violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_sample_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "sample_type must be one of ''1-BIT'' | ''2-BIT'' | ''4-BIT'' | "
	      "''INT8'' | ''UINT8'' | ''INT16'' | ''UINT16'' | ''INT32'' | "
	      "''UINT32'' | ''FLOAT'' | ''DOUBLE''')\n"
	      "WHERE NEW.sample_type NOT IN ('1-BIT', '2-BIT', '4-BIT', "
	      "'INT8', 'UINT8', 'INT16', 'UINT16', 'INT32', "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_sample_update\n"
	      "BEFORE UPDATE OF 'sample_type' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "sample_type must be one of ''1-BIT'' | ''2-BIT'' | ''4-BIT'' | "
	      "''INT8'' | ''UINT8'' | ''INT16'' | ''UINT16'' | ''INT32'' | "
	      "''UINT32'' | ''FLOAT'' | ''DOUBLE''')\n"
	      "WHERE NEW.sample_type NOT IN ('1-BIT', '2-BIT', '4-BIT', "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_pixel_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "pixel_type must be one of ''MONOCHROME'' | ''PALETTE'' | "
	      "''GRAYSCALE'' | ''RGB'' | ''MULTIBAND'' | ''DATAGRID''')\n"
	      "WHERE NEW.pixel_type NOT IN ('MONOCHROME', 'PALETTE', "
	      "'GRAYSCALE', 'RGB', 'MULTIBAND', 'DATAGRID');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_pixel_update\n"
	      "BEFORE UPDATE OF 'pixel_type' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "pixel_type must be one of ''MONOCHROME'' | ''PALETTE'' | "
	      "''GRAYSCALE'' | ''RGB'' | ''MULTIBAND'' | ''DATAGRID''')\n"
	      "WHERE NEW.pixel_type NOT IN ('MONOCHROME', 'PALETTE', "
	      "'GRAYSCALE', 'RGB', 'MULTIBAND', 'DATAGRID');\nEND";
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_bands_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "num_bands must be >= 1')\nWHERE NEW.num_bands < 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_bands_update\n"
	      "BEFORE UPDATE OF 'num_bands' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "num_bands must be >= 1')\nWHERE NEW.num_bands < 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_compression_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "compression must be one of ''NONE'' | ''DEFLATE'' | ''DEFLATE_NO'' | "
	      "''LZMA'' | ''LZMA_NO'' | ''LZ4'' | ''LZ4_NO'' | ''ZSTD'' | ''ZSTD_NO'' | "
	      "''PNG'' | ''JPEG'' | ''LOSSY_WEBP'' | ''LOSSLESS_WEBP'' | ''CCITTFAX4'' | "
	      "''CHARLS'' | ''LOSSY_JP2'' | ''LOSSLESS_JP2''')\n"
	      "WHERE NEW.compression NOT IN ('NONE', 'DEFLATE',  'DEFLATE_NO', "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_compression_update\n"
	      "BEFORE UPDATE OF 'compression' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "compression must be one of ''NONE'' | ''DEFLATE'' | ''DEFLATE_NO'' | "
	      "''LZMA'' | ''LZMA_NO'' | ''LZ4'' | ''LZ4_NO'' | ''ZSTD'' | ''ZSTD_NO'' | "
	      "''PNG'' | ''JPEG'' | ''LOSSY_WEBP'' | ''LOSSLESS_WEBP'' | ''CCITTFAX4'' | "
	      "''CHARLS'' | ''LOSSY_JP2'' | ''LOSSLESS_JP2''')\n"
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_quality_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "quality must be between 0 and 100')\n"
	      "WHERE NEW.quality NOT BETWEEN 0 AND 100;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_quality_update\n"
	      "BEFORE UPDATE OF 'quality' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "quality must be between 0 and 100')\n"
	      "WHERE NEW.quality NOT BETWEEN 0 AND 100;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_tilew_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "tile_width must be an exact multiple of 8 between 256 and 1024')\n"
	      "WHERE CastToInteger(NEW.tile_width) IS NULL OR "
	      "NEW.tile_width NOT BETWEEN 256 AND 1024 OR (NEW.tile_width % 8) <> 0;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_tilew_update\n"
	      "BEFORE UPDATE OF 'tile_width' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "tile_width must be an exact multiple of 8 between 256 and 1024')\n"
	      "WHERE CastToInteger(NEW.tile_width) IS NULL OR "
	      "NEW.tile_width NOT BETWEEN 256 AND 1024 OR (NEW.tile_width % 8) <> 0;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_tileh_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "tile_height must be an exact multiple of 8 between 256 and 1024')\n"
	      "WHERE CastToInteger(NEW.tile_height) IS NULL OR "
	      "NEW.tile_height NOT BETWEEN 256 AND 1024 OR (NEW.tile_height % 8) <> 0;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_tileh_update\n"
	      "BEFORE UPDATE OF 'tile_height' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "tile_height must be an exact multiple of 8 between 256 and 1024')\n"
	      "WHERE CastToInteger(NEW.tile_height) IS NULL OR "
	      "NEW.tile_height NOT BETWEEN 256 AND 1024 OR (NEW.tile_height % 8) <> 0;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_horzres_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "horz_resolution must be positive')\n"
	      "WHERE NEW.horz_resolution IS NOT NULL AND "
	      "(NEW.horz_resolution <= 0.0 OR CastToDouble(NEW.horz_resolution) IS NULL);\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_horzres_update\n"
	      "BEFORE UPDATE OF 'horz_resolution' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "horz_resolution must be positive')\n"
	      "WHERE NEW.horz_resolution IS NOT NULL AND "
	      "(NEW.horz_resolution <= 0.0 OR CastToDouble(NEW.horz_resolution) IS NULL);\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_vertres_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "vert_resolution must be positive')\n"
	      "WHERE NEW.vert_resolution IS NOT NULL AND "
	      "(NEW.vert_resolution <= 0.0 OR CastToDouble(NEW.vert_resolution) IS NULL);\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_vertres_update\n"
	      "BEFORE UPDATE OF 'vert_resolution' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "vert_resolution must be positive')\n"
	      "WHERE NEW.vert_resolution IS NOT NULL AND "
	      "(NEW.vert_resolution <= 0.0 OR CastToDouble(NEW.vert_resolution) IS NULL);\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_nodata_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "invalid nodata_pixel')\nWHERE NEW.nodata_pixel IS NOT NULL AND "
	      "IsValidPixel(NEW.nodata_pixel, NEW.sample_type, NEW.num_bands) <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_nodata_update\n"
	      "BEFORE UPDATE OF 'nodata_pixel' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "invalid nodata_pixel')\nWHERE NEW.nodata_pixel IS NOT NULL AND "
	      "IsValidPixel(NEW.nodata_pixel, NEW.sample_type, NEW.num_bands) <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_palette_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "invalid palette')\nWHERE NEW.palette IS NOT NULL AND "
	      "(NEW.pixel_type <> 'PALETTE' OR NEW.num_bands <> 1 OR "
	      "IsValidRasterPalette(NEW.palette, NEW.sample_type) <> 1);\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_palette_update\n"
	      "BEFORE UPDATE OF 'palette' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "invalid palette')\nWHERE NEW.palette IS NOT NULL AND "
	      "(NEW.pixel_type <> 'PALETTE' OR NEW.num_bands <> 1 OR "
	      "IsValidRasterPalette(NEW.palette, NEW.sample_type) <> 1);\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_statistics_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "invalid statistics')\nWHERE NEW.statistics IS NOT NULL AND "
	      "IsValidRasterStatistics(NEW.statistics, NEW.sample_type, NEW.num_bands) <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_statistics_update\n"
	      "BEFORE UPDATE OF 'statistics' ON 'raster_coverages'"
	      "\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "invalid statistics')\nWHERE NEW.statistics IS NOT NULL AND "
	      "IsValidRasterStatistics(NEW.statistics, NEW.sample_type, NEW.num_bands) <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_monosample_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent MONOCHROME sample_type')\nWHERE NEW.pixel_type = 'MONOCHROME' "
	      "AND NEW.sample_type <> '1-BIT';\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_monosample_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent MONOCHROME sample_type')\nWHERE NEW.pixel_type = 'MONOCHROME' "
	      "AND NEW.sample_type <>'1-BIT';\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_monocompr_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent MONOCHROME compression')\nWHERE NEW.pixel_type = 'MONOCHROME' "
	      "AND NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', "
	      "'LZMA_NO', 'LZ4', 'LZ4_NO', 'ZSTD', 'ZSTD_NO', 'PNG', "
	      "'CCITTFAX4');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_monocompr_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent MONOCHROME compression')\nWHERE NEW.pixel_type = 'MONOCHROME' "
	      "AND NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', "
	      "'LZMA_NO', 'LZ4', 'LZ4_NO', 'ZSTD', 'ZSTD_NO', 'PNG', 'CCITTFAX4');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_monobands_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent MONOCHROME num_bands')\nWHERE NEW.pixel_type = 'MONOCHROME' "
	      "AND NEW.num_bands <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_monobands_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent MONOCHROME num_bands')\nWHERE NEW.pixel_type = 'MONOCHROME' "
	      "AND NEW.num_bands <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_pltsample_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent PALETTE sample_type')\nWHERE NEW.pixel_type = 'PALETTE' "
	      "AND NEW.sample_type NOT IN ('1-BIT', '2-BIT', '4-BIT', 'UINT8');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_pltsample_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent PALETTE sample_type')\nWHERE NEW.pixel_type = 'PALETTE' "
	      "AND NEW.sample_type NOT IN ('1-BIT', '2-BIT', '4-BIT', 'UINT8');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_pltcompr_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent PALETTE compression')\nWHERE NEW.pixel_type = 'PALETTE' "
	      "AND NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', "
	      "'LZMA_NO', 'LZ4', 'LZ4_NO', 'ZSTD', 'ZSTD_NO', 'PNG');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_pltcompr_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent PALETTE compression')\nWHERE NEW.pixel_type = 'PALETTE' "
	      "AND NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', "
	      "'LZMA_NO', 'LZ4', 'LZ4_NO', 'ZSTD', 'ZSTD_NO', 'PNG');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_pltbands_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent PALETTE num_bands')\nWHERE NEW.pixel_type = 'PALETTE' "
	      "AND NEW.num_bands <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_pltbands_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent PALETTE num_bands')\nWHERE NEW.pixel_type = 'PALETTE' "
	      "AND NEW.num_bands <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_graysample_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent GRAYSCALE sample_type')\nWHERE NEW.pixel_type = 'GRAYSCALE' "
	      "AND NEW.sample_type NOT IN ('2-BIT', '4-BIT', 'UINT8');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_graysample_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent GRAYSCALE sample_type')\nWHERE NEW.pixel_type = 'GRAYSCALE' "
	      "AND NEW.sample_type NOT IN ('2-BIT', '4-BIT', 'UINT8');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_graybands_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent GRAYSCALE num_bands')\nWHERE NEW.pixel_type = 'GRAYSCALE' "
	      "AND NEW.num_bands <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_graybands_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent GRAYSCALE num_bands')\nWHERE NEW.pixel_type = 'GRAYSCALE' "
	      "AND NEW.num_bands <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_graycompr_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent GRAYSCALE compression')\nWHERE NEW.pixel_type = "
	      "'GRAYSCALE' AND NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', "
	      "'LZMA', 'LZMA_NO', 'LZ4', 'LZ4_NO', 'ZSTD', 'ZSTD_NO', 'PNG', "
	      "'JPEG', 'LOSSY_WEBP', 'LOSSLESS_WEBP', 'CHARLS', 'LOSSY_JP2', "
	      "'LOSSLESS_JP2');\nEND";
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_graycompr_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent GRAYSCALE compression')\nWHERE NEW.pixel_type = "
	      "'GRAYSCALE' AND NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', "
	      "'LZMA', 'LZMA_NO', 'LZ4', 'LZ4_NO', 'ZSTD', 'ZSTD_NO', 'PNG', "
	      "'JPEG', 'LOSSY_WEBP', 'LOSSLESS_WEBP', 'CHARLS', 'LOSSY_JP2', "
	      "'LOSSLESS_JP2');\nEND";
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_rgbsample_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent RGB sample_type')\nWHERE NEW.pixel_type = 'RGB' "
	      "AND NEW.sample_type NOT IN ('UINT8', 'UINT16');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_rgbsample_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent RGB sample_type')\nWHERE NEW.pixel_type = 'RGB' "
	      "AND NEW.sample_type NOT IN ('UINT8', 'UINT16');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_rgbcompr_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent RGB compression')\nWHERE NEW.pixel_type = 'RGB' "
	      "AND ((NEW.sample_type = 'UINT8' AND NEW.compression NOT IN ("
	      "'NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', 'LZMA_NO', 'LZ4', 'LZ4_NO', "
	      "'ZSTD', 'ZSTD_NO', 'PNG', 'JPEG', 'LOSSY_WEBP', 'LOSSLESS_WEBP', "
	      "'CHARLS', 'LOSSY_JP2', 'LOSSLESS_JP2') OR (NEW.sample_type = "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_rgbcompr_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent RGB compression')\nWHERE NEW.pixel_type = 'RGB' "
	      "AND ((NEW.sample_type = 'UINT8' AND NEW.compression NOT IN ("
	      "'NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', 'LZMA_NO', 'LZ4', 'LZ4_NO', "
	      "'ZSTD', 'ZSTD_NO', 'PNG', 'JPEG', 'LOSSY_WEBP', 'LOSSLESS_WEBP', "
	      "'CHARLS', 'LOSSY_JP2', 'LOSSLESS_JP2') OR (NEW.sample_type = "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_rgbbands_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent RGB num_bands')\nWHERE NEW.pixel_type = 'RGB' "
	      "AND NEW.num_bands <> 3;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_rgbbands_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent RGB num_bands')\nWHERE NEW.pixel_type = 'RGB' "
	      "AND NEW.num_bands <> 3;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_multisample_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent MULTIBAND sample_type')\nWHERE NEW.pixel_type = 'MULTIBAND' "
	      "AND NEW.sample_type NOT IN ('UINT8', 'UINT16');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_multisample_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent MULTIBAND sample_type')\nWHERE NEW.pixel_type = 'MULTIBAND' "
	      "AND NEW.sample_type NOT IN ('UINT8', 'UINT16');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_multicompr_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent MULTIBAND compression')\nWHERE NEW.pixel_type = "
	      "'MULTIBAND' AND ((NEW.num_bands NOT IN (3, 4) AND "
	      "NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', "
	      "'LZMA_NO', 'LZ4', 'LZ4_NO', 'ZSTD', 'ZSTD_NO')) OR	"
	      "(NEW.sample_type <> 'UINT16' AND NEW.num_bands IN (3, 4) AND "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_multicompr_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent MULTIBAND compression')\nWHERE NEW.pixel_type = "
	      "'MULTIBAND' AND ((NEW.num_bands NOT IN (3, 4) AND "
	      "NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', "
	      "'LZMA_NO', 'LZ4', 'LZ4_NO', 'ZSTD', 'ZSTD_NO')) OR	"
	      "(NEW.sample_type <> 'UINT16' AND NEW.num_bands IN (3, 4) AND "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_multibands_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent MULTIBAND num_bands')\nWHERE NEW.pixel_type = 'MULTIBAND' "
	      "AND NEW.num_bands < 2;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_multibands_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent MULTIBAND num_bands')\nWHERE NEW.pixel_type = 'MULTIBAND' "
	      "AND NEW.num_bands < 2;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_gridsample_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent DATAGRID sample_type')\nWHERE NEW.pixel_type = 'DATAGRID' "
	      "AND NEW.sample_type NOT IN ('INT8', 'UINT8', 'INT16', 'UINT16', "
	      "'INT32', 'UINT32', 'FLOAT', 'DOUBLE');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_gridsample_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent DATAGRID sample_type')\nWHERE NEW.pixel_type = 'DATAGRID' "
	      "AND NEW.sample_type NOT IN ('INT8', 'UINT8', 'INT16', 'UINT16', "
	      "'INT32', 'UINT32', 'FLOAT', 'DOUBLE');\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_gridcompr_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent DATAGRID compression')\nWHERE NEW.pixel_type = 'DATAGRID' "
	      "AND (((NEW.sample_type NOT IN ('UINT8', 'UINT16')) AND NEW.compression "
	      "NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', 'LZMA_NO', 'LZ4', "
	      "'LZ4_NO', 'ZSTD', 'ZSTD_NO')) OR ((NEW.sample_type IN ('UINT8', 'UINT16')) "
	      "AND NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_gridcompr_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent DATAGRID compression')\nWHERE NEW.pixel_type = 'DATAGRID' "
	      "AND (((NEW.sample_type NOT IN ('UINT8', 'UINT16')) AND NEW.compression "
	      "NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', 'LZMA_NO', 'LZ4', "
	      "'LZ4_NO', 'ZSTD', 'ZSTD_NO')) OR ((NEW.sample_type IN ('UINT8', 'UINT16')) "
	      "AND NEW.compression NOT IN ('NONE', 'DEFLATE', 'DEFLATE_NO', 'LZMA', "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_gridbands_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent DATAGRID num_bands')\nWHERE NEW.pixel_type = 'DATAGRID' "
	      "AND NEW.num_bands <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_gridbands_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "inconsistent DATAGRID num_bands')\nWHERE NEW.pixel_type = 'DATAGRID' "
	      "AND NEW.num_bands <> 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_georef_insert\n"
	      "BEFORE INSERT ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages violates constraint: "
	      "inconsistent georeferencing infos')\n"
	      "WHERE NOT ((NEW.horz_resolution IS NULL AND NEW.vert_resolution IS NULL "
	      "AND NEW.srid IS NULL) OR (NEW.horz_resolution IS NOT NULL "
	      "AND NEW.vert_resolution IS NOT NULL AND NEW.srid IS NOT NULL));\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_georef_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'update on raster_coverages violates constraint: "
	      "inconsistent georeferencing infos')\n"
	      "WHERE NOT ((NEW.horz_resolution IS NULL AND NEW.vert_resolution IS NULL "
	      "AND NEW.srid IS NULL) OR (NEW.horz_resolution IS NOT NULL "
	      "AND NEW.vert_resolution IS NOT NULL AND NEW.srid IS NOT NULL));\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_update\n"
	      "BEFORE UPDATE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'update on raster_coverages violates constraint: "
	      "attempting to change the definition of an already populated Coverage')\n"
	      "WHERE IsPopulatedCoverage(NULL, OLD.coverage_name) = 1 AND "
	      "((OLD.sample_type <> NEW.sample_type) AND (OLD.pixel_type <> NEW.sample_type) "
	      "OR (OLD.num_bands <> NEW.num_bands) OR (OLD.compression <> NEW.compression) "
	      "OR (OLD.quality <> NEW.quality) OR (OLD.tile_width <> NEW.tile_width) "
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS raster_coverages_delete\n"
	      "BEFORE DELETE ON 'raster_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT, 'delete on raster_coverages violates constraint: "
	      "attempting to delete the definition of an already populated Coverage')\n"
	      "WHERE IsPopulatedCoverage(NULL, OLD.coverage_name) = 1;\nEND";
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
................................................................................
		return 0;
	    }
      }

    if (ok_raster_coverages_srid)
      {
	  /* creating the raster_coverages_srid triggers */
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_srid_name_insert\n"
	      "BEFORE INSERT ON 'raster_coverages_srid'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages_srid violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages_srid violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_srid_name_update\n"
	      "BEFORE UPDATE OF 'coverage_name' ON 'raster_coverages_srid'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'update on raster_coverages_srid violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'update on raster_coverages_srid violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
		return 0;
	    }
      }

    if (ok_raster_coverages_keyword)
      {
	  /* creating the raster_coverages_keyword triggers */
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_keyword_name_insert\n"
	      "BEFORE INSERT ON 'raster_coverages_keyword'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages_keyword violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'insert on raster_coverages_keyword violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS raster_coverages_keyword_name_update\n"
	      "BEFORE UPDATE OF 'coverage_name' ON 'raster_coverages_keyword'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'update on raster_coverages_keyword violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'update on raster_coverages_keyword violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
		sqlite3_free (err_msg);
		return 0;
	    }
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_raster_coverages (sqlite3 * sqlite)
{
/* creating the "raster_coverages" table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE IF NOT EXISTS raster_coverages (\n"
	"coverage_name TEXT NOT NULL PRIMARY KEY,\n"
	"title TEXT NOT NULL DEFAULT '*** missing Title ***',\n"
	"abstract TEXT NOT NULL DEFAULT '*** missing Abstract ***',\n"
	"sample_type TEXT NOT NULL DEFAULT '*** undefined ***',\n"
	"pixel_type TEXT NOT NULL DEFAULT '*** undefined ***',\n"
	"num_bands INTEGER NOT NULL DEFAULT 1,\n"
	"compression TEXT NOT NULL DEFAULT 'NONE',\n"
................................................................................
      {
	  spatialite_e ("CREATE TABLE 'raster_coverages' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

/* creating the raster_coverages_srid table */
    sql = "CREATE TABLE IF NOT EXISTS raster_coverages_srid (\n"
	"coverage_name TEXT NOT NULL,\n"
	"srid INTEGER NOT NULL,\n"
	"extent_minx DOUBLE,\n"
	"extent_miny DOUBLE,\n"
	"extent_maxx DOUBLE,\n"
	"extent_maxy DOUBLE,\n"
	"CONSTRAINT pk_raster_coverages_srid PRIMARY KEY (coverage_name, srid),\n"
................................................................................
	  spatialite_e ("CREATE TABLE 'raster_coverages_srid' error: %s\n",
			err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

/* creating the raster_coverages_ref_sys view */
    sql = "CREATE VIEW IF NOT EXISTS raster_coverages_ref_sys AS\n"
	"SELECT c.coverage_name AS coverage_name, c.title AS title, "
	"c.abstract AS abstract, c.sample_type AS sample_type, "
	"c.pixel_type AS pixel_type, c.num_bands AS num_bands, "
	"c.compression AS compression, c.quality AS quality, "
	"c.tile_width AS tile_width, c.tile_height AS tile_height, "
	"c.horz_resolution AS horz_resolution, c.vert_resolution AS vert_resolution, "
	"c.nodata_pixel AS nodata_pixel, c.palette AS palette, "
................................................................................
	  spatialite_e ("CREATE VIEW 'raster_coverages_ref_sys' error: %s\n",
			err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

/* creating the raster_coverages_keyword table */
    sql = "CREATE TABLE IF NOT EXISTS raster_coverages_keyword (\n"
	"coverage_name TEXT NOT NULL,\n"
	"keyword TEXT NOT NULL,\n"
	"CONSTRAINT pk_raster_coverages_keyword PRIMARY KEY (coverage_name, keyword),\n"
	"CONSTRAINT fk_raster_coverages_keyword FOREIGN KEY (coverage_name) "
	"REFERENCES raster_coverages (coverage_name) ON DELETE CASCADE)";
    ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
    if (ret != SQLITE_OK)
................................................................................
		sqlite3_free (err_msg);
		return 0;
	    }
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_rl2map_configurations (sqlite3 * sqlite, int relaxed)
{
/* creating the "rl2map_configurations" table */
    char *sql;
    int ret;
    char *err_msg = NULL;

................................................................................
	      ok_vector_coverages_keyword = 1;
      }
    sqlite3_free_table (results);

    if (ok_vector_coverages)
      {
	  /* creating the vector_coverages triggers */
	  sql = "CREATE TRIGGER IF NOT EXISTS vector_coverages_name_insert\n"
	      "BEFORE INSERT ON 'vector_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on vector_coverages violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'insert on vector_coverages violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql = "CREATE TRIGGER IF NOT EXISTS vector_coverages_name_update\n"
	      "BEFORE UPDATE OF 'coverage_name' ON 'vector_coverages'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'update on vector_coverages violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'update on vector_coverages violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
		return 0;
	    }
      }

    if (ok_vector_coverages_srid)
      {
	  /* creating the vector_coverages_srid triggers */
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS vector_coverages_srid_name_insert\n"
	      "BEFORE INSERT ON 'vector_coverages_srid'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on vector_coverages_srid violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'insert on vector_coverages_srid violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS vector_coverages_srid_name_update\n"
	      "BEFORE UPDATE OF 'coverage_name' ON 'vector_coverages_srid'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'update on vector_coverages_srid violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'update on vector_coverages_srid violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
		return 0;
	    }
      }

    if (ok_vector_coverages_keyword)
      {
	  /* creating the vector_coverages_keyword triggers */
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS vector_coverages_keyword_name_insert\n"
	      "BEFORE INSERT ON 'vector_coverages_keyword'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'insert on vector_coverages_keyword violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'insert on vector_coverages_keyword violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
	  ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
	  if (ret != SQLITE_OK)
	    {
		spatialite_e ("SQL error: %s\n", err_msg);
		sqlite3_free (err_msg);
		return 0;
	    }
	  sql =
	      "CREATE TRIGGER IF NOT EXISTS vector_coverages_keyword_name_update\n"
	      "BEFORE UPDATE OF 'coverage_name' ON 'vector_coverages_keyword'\nFOR EACH ROW BEGIN\n"
	      "SELECT RAISE(ABORT,'update on vector_coverages_keyword violates constraint: "
	      "coverage_name value must not contain a single quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%''%');\n"
	      "SELECT RAISE(ABORT,'update on vector_coverages_keyword violates constraint: "
	      "coverage_name value must not contain a double quote')\n"
	      "WHERE NEW.coverage_name LIKE ('%\"%');\n"
................................................................................
		sqlite3_free (err_msg);
		return 0;
	    }
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_vector_coverages (sqlite3 * sqlite)
{
/* creating the "vector_coverages" table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE IF NOT EXISTS vector_coverages (\n"
	"coverage_name TEXT NOT NULL PRIMARY KEY,\n"
	"f_table_name TEXT,\n"
	"f_geometry_column TEXT,\n"
	"view_name TEXT,\n"
	"view_geometry TEXT,\n"
	"virt_name TEXT,\n"
	"virt_geometry TEXT,\n"
................................................................................
    if (ret != SQLITE_OK)
      {
	  spatialite_e ("CREATE TABLE 'vector_coverages' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
/* creating the VectorLayers index */
    sql =
	"CREATE UNIQUE INDEX IF NOT EXISTS idx_vector_coverages ON vector_coverages "
	"(f_table_name, f_geometry_column)";
    ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
    if (ret != SQLITE_OK)
      {
	  spatialite_e ("CREATE INDEX 'idx_vector_coverages' error: %s\n",
			err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

/* creating the vector_coverages_srid table */
    sql = "CREATE TABLE IF NOT EXISTS vector_coverages_srid (\n"
	"coverage_name TEXT NOT NULL,\n"
	"srid INTEGER NOT NULL,\n"
	"extent_minx DOUBLE,\n"
	"extent_miny DOUBLE,\n"
	"extent_maxx DOUBLE,\n"
	"extent_maxy DOUBLE,\n"
	"CONSTRAINT pk_vector_coverages_srid PRIMARY KEY (coverage_name, srid),\n"
................................................................................
	  spatialite_e ("CREATE TABLE 'vector_coverages_srid' error: %s\n",
			err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

/* creating the vector_coverages_ref_sys view */
    sql = "CREATE VIEW IF NOT EXISTS vector_coverages_ref_sys AS\n"
	"SELECT v.coverage_name AS coverage_name, v.title AS title, v.abstract AS abstract, "
	"v.is_queryable AS is_queryable, v.geo_minx AS geo_minx, v.geo_miny AS geo_miny, "
	"v.geo_maxx AS geo_maxx, v.geo_maxy AS geo_maxy, v.extent_minx AS extent_minx, "
	"v.extent_miny AS extent_miny, v.extent_maxx AS extent_maxx, v.extent_maxy AS extent_maxy, "
	"s.srid AS srid, 1 AS native_srid, s.auth_name AS auth_name, s.auth_srid AS auth_srid, "
	"s.ref_sys_name AS ref_sys_name, s.proj4text AS proj4text\n"
	"FROM vector_coverages AS v\n"
................................................................................
	  spatialite_e ("CREATE VIEW 'vector_coverages_ref_sys' error: %s\n",
			err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

/* creating the vector_coverages_keyword table */
    sql = "CREATE TABLE IF NOT EXISTS vector_coverages_keyword (\n"
	"coverage_name TEXT NOT NULL,\n"
	"keyword TEXT NOT NULL,\n"
	"CONSTRAINT pk_vector_coverages_keyword PRIMARY KEY (coverage_name, keyword),\n"
	"CONSTRAINT fk_vector_coverages_keyword FOREIGN KEY (coverage_name) "
	"REFERENCES vector_coverages (coverage_name) ON DELETE CASCADE)";
    ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
    if (ret != SQLITE_OK)
................................................................................
      }
    for (i = 1; i <= rows; i++)
	exists = 1;
    sqlite3_free_table (results);
    return exists;
}

SPATIALITE_PRIVATE int
create_wms_tables (sqlite3 * sqlite)
{
/* creating the WMS support tables */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE IF NOT EXISTS wms_getcapabilities (\n"
	"id INTEGER PRIMARY KEY AUTOINCREMENT,\n"
	"url TEXT NOT NULL,\n"
	"title TEXT NOT NULL DEFAULT '*** undefined ***',\n"
	"abstract TEXT NOT NULL DEFAULT '*** undefined ***')";
    ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
    if (ret != SQLITE_OK)
      {
	  spatialite_e ("CREATE TABLE 'wms_getcapabilities' error: %s\n",
			err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    sql =
	"CREATE UNIQUE INDEX IF NOT EXISTS idx_wms_getcapabilities ON wms_getcapabilities (url)";
    ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
    if (ret != SQLITE_OK)
      {
	  spatialite_e ("CREATE INDEX 'idx_wms_getcapabilities' error: %s\n",
			err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

    sql = "CREATE TABLE IF NOT EXISTS wms_getmap (\n"
	"id INTEGER PRIMARY KEY AUTOINCREMENT,\n"
	"parent_id INTEGER NOT NULL,\n"
	"url TEXT NOT NULL,\n"
	"layer_name TEXT NOT NULL,\n"
	"title TEXT NOT NULL DEFAULT '*** undefined ***',\n"
	"abstract TEXT NOT NULL DEFAULT '*** undefined ***',\n"
	"version TEXT NOT NULL,\n"
................................................................................
    if (ret != SQLITE_OK)
      {
	  spatialite_e ("CREATE INDEX 'idx_wms_getmap' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

    sql = "CREATE TABLE IF NOT EXISTS wms_settings (\n"
	"id INTEGER PRIMARY KEY AUTOINCREMENT,\n"
	"parent_id INTEGER NOT NULL,\n"
	"key TEXT NOT NULL CHECK (Lower(key) IN ('version', 'format', 'style')),\n"
	"value TEXT NOT NULL,\n"
	"is_default INTEGER NOT NULL CHECK (is_default IN (0, 1)),\n"
	"CONSTRAINT fk_wms_settings FOREIGN KEY (parent_id) "
	"REFERENCES wms_getmap (id) ON DELETE CASCADE)";
................................................................................
    if (ret != SQLITE_OK)
      {
	  spatialite_e ("CREATE INDEX 'idx_wms_settings' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }

    sql = "CREATE TABLE IF NOT EXISTS wms_ref_sys (\n"
	"id INTEGER PRIMARY KEY AUTOINCREMENT,\n"
	"parent_id INTEGER NOT NULL,\n"
	"srs TEXT NOT NULL,\n"
	"minx DOUBLE NOT NULL,\n"
	"miny DOUBLE NOT NULL,\n"
	"maxx DOUBLE NOT NULL,\n"
	"maxy DOUBLE NOT NULL,\n"
................................................................................
    ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
    if (ret != SQLITE_OK)
      {
	  spatialite_e ("CREATE TABLE 'wms_ref_sys' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    sql =
	"CREATE UNIQUE INDEX IF NOT EXISTS idx_wms_ref_sys ON wms_ref_sys (parent_id, srs)";
    ret = sqlite3_exec (sqlite, sql, NULL, NULL, &err_msg);
    if (ret != SQLITE_OK)
      {
	  spatialite_e ("CREATE INDEX 'idx_wms_ref_sys' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
................................................................................
		sqlite3_free (err_msg);
		return 0;
	    }
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_external_graphics (sqlite3 * sqlite)
{
/* creating the SE_external_graphics table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE SE_external_graphics (\n"
................................................................................
		sqlite3_free (err_msg);
		return 0;
	    }
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_fonts (sqlite3 * sqlite)
{
/* creating the SE_fonts table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE SE_fonts (\n"
................................................................................
		sqlite3_free (err_msg);
		return 0;
	    }
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_vector_styles (sqlite3 * sqlite, int relaxed)
{
/* creating the SE_vector_styles table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE SE_vector_styles (\n"
................................................................................
		sqlite3_free (err_msg);
		return 0;
	    }
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_vector_styled_layers (sqlite3 * sqlite)
{
/* creating the SE_vector_styled_layers table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE SE_vector_styled_layers (\n"
................................................................................
		sqlite3_free (err_msg);
		return 0;
	    }
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_raster_styles (sqlite3 * sqlite, int relaxed)
{
/* creating the SE_raster_styles table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE SE_raster_styles (\n"
................................................................................
		sqlite3_free (err_msg);
		return 0;
	    }
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_raster_styled_layers (sqlite3 * sqlite)
{
/* creating the SE_raster_styled_layers table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE SE_raster_styled_layers (\n"
................................................................................
	  return 0;
      }
    if (!create_raster_styled_layers_triggers (sqlite))
	return 0;
    return 1;
}

SPATIALITE_PRIVATE int
create_external_graphics_view (sqlite3 * sqlite)
{
/* creating the SE_external_graphics_view view */
    char *sql_statement;
    int ret;
    char *err_msg = NULL;
    sql_statement =
................................................................................
	      ("CREATE VIEW 'SE_external_graphics_view' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_fonts_view (sqlite3 * sqlite)
{
/* creating the SE_fonts_view view */
    char *sql_statement;
    int ret;
    char *err_msg = NULL;
    sql_statement =
................................................................................
	  spatialite_e ("CREATE VIEW 'SE_fonts_view' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_vector_styles_view (sqlite3 * sqlite)
{
/* creating the SE_vector_styles_view view */
    char *sql_statement;
    int ret;
    char *err_msg = NULL;
    sql_statement =
................................................................................
	      ("CREATE VIEW 'SE_vector_styles_view' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_raster_styles_view (sqlite3 * sqlite)
{
/* creating the SE_raster_styles_view view */
    char *sql_statement;
    int ret;
    char *err_msg = NULL;
    sql_statement =
................................................................................
	      ("CREATE VIEW 'SE_raster_styles_view' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_rl2map_configurations_view (sqlite3 * sqlite)
{
/* creating the rl2map_configurations_view view */
    char *sql_statement;
    int ret;
    char *err_msg = NULL;
    sql_statement =
................................................................................
	      ("CREATE VIEW 'rl2map_configurations_view' error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_vector_styled_layers_view (sqlite3 * sqlite)
{
/* creating the SE_vector_styled_layers_view view */
    char *sql_statement;
    int ret;
    char *err_msg = NULL;
    sql_statement =
................................................................................
	      ("SELECT SE_AutoRegisterStandardBrushes() error: %s\n", err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_raster_styled_layers_view (sqlite3 * sqlite)
{
/* creating the SE_raster_styled_layers_view view */
    char *sql_statement;
    int ret;
    char *err_msg = NULL;
    sql_statement =
................................................................................
      }
    for (i = 1; i <= rows; i++)
	exists = 1;
    sqlite3_free_table (results);
    return exists;
}

SPATIALITE_PRIVATE int
create_iso_metadata (sqlite3 * sqlite, int relaxed)
{
/* creating the ISO_metadata table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE ISO_metadata (\n"
................................................................................
			err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_iso_metadata_reference (sqlite3 * sqlite)
{
/* creating the ISO_metadata_reference table */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE TABLE ISO_metadata_reference (\n"
................................................................................
	       err_msg);
	  sqlite3_free (err_msg);
	  return 0;
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_iso_metadata_view (sqlite3 * sqlite)
{
/* creating the ISO_metadata_view view */
    char *sql;
    int ret;
    char *err_msg = NULL;
    sql = "CREATE VIEW ISO_metadata_view AS\n"
................................................................................
    return 1;

  error:
    return 0;
}

#endif /* end including LIBXML2 */

static int
do_check_if_table_exists (sqlite3 * sqlite, const char *table)
{
/* checking if a Table is already defined */
    int ret;
    int i;
    char **results;
    int rows;
    int columns;
    int count = 0;
    char *qtable = gaiaDoubleQuotedSql (table);
    char *sql = sqlite3_mprintf ("PRAGMA table_info(\"%s\")", qtable);
    free (qtable);
    ret = sqlite3_get_table (sqlite, sql, &results, &rows, &columns, NULL);
    sqlite3_free (sql);
    if (ret != SQLITE_OK)
	return 0;
    for (i = 1; i <= rows; i++)
	count++;
    sqlite3_free_table (results);
    if (count == 0)
	return 0;
    return 1;
}

SPATIALITE_PRIVATE int
createMissingSystemTables (sqlite3 * sqlite, const void *cache, int relaxed,
			   int transaction, char **err_msg)
{
/* attempting to create all missing System Tables required by version 5 */
#ifndef ENABLE_LIBXML2		/* unsupported LIBXML2 */
    *err_msg =
	sqlite3_mprintf
	("this build does not support LIBXML2 ... cowardly quitting");
    return 0;
#endif
#ifndef ENABLE_RTTOPO		/* unsipported RTTOPO */
    *err_msg =
	sqlite3_mprintf
	("this build does not support RTTOPO ... cowardly quitting");
    return 0;
#endif

#ifdef ENABLE_LIBXML2		/* only if LibXML2 support is available */
#ifdef ENABLE_RTTOPO		/* RTTOPO is supported */
    int ret;
    struct str_tables
    {
	const char *table_name;
	int (*creator) (sqlite3 * sqlite);
	int (*creator_void) (void *sqlite);
	int (*creator_relaxed) (sqlite3 * sqlite, int relaxed);
	int (*creator_cache) (sqlite3 * sqlite, const void *cache);
    };
    static struct str_tables tables[] = {
	{"data_licenses", create_data_licenses, NULL, NULL, NULL},
	{"raster_coverages", create_raster_coverages, NULL, NULL, NULL},
	{"raster_coverages_keyword", create_raster_coverages, NULL, NULL, NULL},
	{"raster_coverages_srid", create_raster_coverages, NULL, NULL, NULL},
	{"raster_coverages_ref_sys", create_raster_coverages, NULL, NULL, NULL},
	{"vector_coverages", create_vector_coverages, NULL, NULL, NULL},
	{"vector_coverages_keyword", create_vector_coverages, NULL, NULL, NULL},
	{"vector_coverages_srid", create_vector_coverages, NULL, NULL, NULL},
	{"vector_coverages_ref_sys", create_vector_coverages, NULL, NULL, NULL},
	{"wms_getcapabilities", create_wms_tables, NULL, NULL, NULL},
	{"wms_getmap", create_wms_tables, NULL, NULL, NULL},
	{"wms_ref_sys", create_wms_tables, NULL, NULL, NULL},
	{"wms_settings", create_wms_tables, NULL, NULL, NULL},
	{"topologies", NULL, do_create_topologies, NULL, NULL},
	{"networks", NULL, do_create_networks, NULL, NULL},
	{"SE_external_graphics", create_external_graphics, NULL, NULL, NULL},
	{"SE_external_graphics_view", create_external_graphics_view, NULL, NULL,
	 NULL},
	{"SE_fonts", create_fonts, NULL, NULL, NULL},
	{"SE_fonts_view", create_fonts_view, NULL, NULL, NULL},
	{"SE_raster_styles", NULL, NULL, create_raster_styles, NULL},
	{"SE_raster_styles_view", create_raster_styles_view, NULL, NULL, NULL},
	{"SE_raster_styled_layers", create_raster_styled_layers, NULL, NULL,
	 NULL},
	{"SE_raster_styled_layers_view", create_raster_styled_layers_view, NULL,
	 NULL, NULL},
	{"SE_vector_styles", NULL, NULL, create_vector_styles, NULL},
	{"SE_vector_styles_view", create_vector_styles_view, NULL, NULL, NULL},
	{"SE_vector_styled_layers", create_vector_styled_layers, NULL, NULL,
	 NULL},
	{"SE_vector_styled_layers_view", create_vector_styled_layers_view, NULL,
	 NULL, NULL},
	{"ISO_metadata", NULL, NULL, create_iso_metadata, NULL},
	{"ISO_metadata_reference", create_iso_metadata_reference, NULL, NULL,
	 NULL},
	{"ISO_metadata_view", create_iso_metadata_view, NULL, NULL, NULL},
	{"stored_procedures", NULL, NULL, NULL, gaia_stored_proc_create_tables},
	{"stored_variables", NULL, NULL, NULL, gaia_stored_proc_create_tables},
	{"rl2map_configurations", NULL, NULL, create_rl2map_configurations,
	 NULL},
	{"rl2map_configurations_view", create_rl2map_configurations_view, NULL,
	 NULL, NULL},
	{NULL, NULL, NULL, NULL, NULL}
    };
    struct str_tables *p_table = tables;

    if (transaction)
      {
	  /* starting a Transaction */
	  ret = sqlite3_exec (sqlite, "BEGIN", NULL, NULL, NULL);
	  if (ret != SQLITE_OK)
	    {
		*err_msg =
		    sqlite3_mprintf ("Unable to start a Transaction (BEGIN)");
		return 0;
	    }
      }

    while (p_table->table_name != NULL)
      {
	  int exists = do_check_if_table_exists (sqlite, p_table->table_name);
	  if (!exists)
	    {
		if (p_table->creator != NULL)
		    ret = p_table->creator (sqlite);
		if (p_table->creator_void != NULL)
		    ret = p_table->creator_void ((void *) sqlite);
		if (p_table->creator_relaxed != NULL)
		    ret = p_table->creator_relaxed (sqlite, relaxed);
		if (p_table->creator_cache != NULL)
		    ret = p_table->creator_cache (sqlite, cache);
		if (!ret)
		  {
		      *err_msg =
			  sqlite3_mprintf ("Unable to create \"%s\"",
					   p_table->table_name);
		      return 0;
		  }
	    }
	  if (strcmp (p_table->table_name, "SE_external_graphics") == 0)
	    {
		/* autoregistering all Standard Brushes */
		ret =
		    sqlite3_exec (sqlite,
				  "SELECT SE_AutoRegisterStandardBrushes()",
				  NULL, NULL, NULL);
		if (ret != SQLITE_OK)
		  {
		      *err_msg =
			  sqlite3_mprintf
			  ("Unexpected failure when registering Standard Brushes");
		      return 0;
		  }
	    }
	  p_table++;
      }

    if (transaction)
      {
	  /* confirming the still pending Transaction */
	  ret = sqlite3_exec (sqlite, "COMMIT", NULL, NULL, NULL);
	  if (ret != SQLITE_OK)
	    {
		*err_msg =
		    sqlite3_mprintf
		    ("Unable to confirm a Transaction (COMMIT)");
		return 0;
	    }
      }

/* full success */
    *err_msg = NULL;
    return 1;
#endif /* end RTTOPO */
#endif /* end LIBXML2 */
}

Changes to src/spatialite/metatables.c.

1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
....
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
....
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
	  spatialite_e ("SQL error: %s: %s\n", sql, errMsg);
	  sqlite3_free (errMsg);
	  return 0;
      }
    return 1;
}

static int
create_geometry_columns_times (sqlite3 * sqlite)
{
    char sql[4186];
    char *errMsg = NULL;
    int ret;

    if (sqlite3_db_readonly (sqlite, "MAIN") == 1)
      {
................................................................................
	  spatialite_e ("SQL error: %s: %s\n", sql, errMsg);
	  sqlite3_free (errMsg);
	  return 0;
      }
    return 1;
}

static int
create_data_licenses (sqlite3 * sqlite)
{
    char sql[4186];
    char *errMsg = NULL;
    int ret;

    if (sqlite3_db_readonly (sqlite, "MAIN") == 1)
................................................................................
	return 0;
    if (!create_geometry_columns_field_infos (sqlite))
	return 0;
    if (!create_views_geometry_columns_field_infos (sqlite))
	return 0;
    if (!create_virts_geometry_columns_field_infos (sqlite))
	return 0;
    if (!create_geometry_columns_times (sqlite))
	return 0;
    if (!create_geometry_columns_auth (sqlite))
	return 0;
    if (!create_views_geometry_columns_auth (sqlite))
	return 0;
    if (!create_virts_geometry_columns_auth (sqlite))
	return 0;







|
|







 







|







 







|







1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
....
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
....
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
	  spatialite_e ("SQL error: %s: %s\n", sql, errMsg);
	  sqlite3_free (errMsg);
	  return 0;
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_geometry_columns_time (sqlite3 * sqlite)
{
    char sql[4186];
    char *errMsg = NULL;
    int ret;

    if (sqlite3_db_readonly (sqlite, "MAIN") == 1)
      {
................................................................................
	  spatialite_e ("SQL error: %s: %s\n", sql, errMsg);
	  sqlite3_free (errMsg);
	  return 0;
      }
    return 1;
}

SPATIALITE_PRIVATE int
create_data_licenses (sqlite3 * sqlite)
{
    char sql[4186];
    char *errMsg = NULL;
    int ret;

    if (sqlite3_db_readonly (sqlite, "MAIN") == 1)
................................................................................
	return 0;
    if (!create_geometry_columns_field_infos (sqlite))
	return 0;
    if (!create_views_geometry_columns_field_infos (sqlite))
	return 0;
    if (!create_virts_geometry_columns_field_infos (sqlite))
	return 0;
    if (!create_geometry_columns_time (sqlite))
	return 0;
    if (!create_geometry_columns_auth (sqlite))
	return 0;
    if (!create_views_geometry_columns_auth (sqlite))
	return 0;
    if (!create_virts_geometry_columns_auth (sqlite))
	return 0;

Changes to src/spatialite/spatialite.c.

317
318
319
320
321
322
323















































































324
325
326
327
328
329
330
....
2861
2862
2863
2864
2865
2866
2867

2868
2869
2870
2871
2872
2873
2874
....
2920
2921
2922
2923
2924
2925
2926

2927
2928
2929
2930
2931
2932



2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
.....
48005
48006
48007
48008
48009
48010
48011










48012
48013
48014
48015
48016
48017
48018
	  sqlite3_free (x.z);
      }
    else
      {
	  sqlite3_result_text (context, x.z, x.nUsed, sqlite3_free);
      }
}
















































































static void
fnct_spatialite_version (sqlite3_context * context, int argc,
			 sqlite3_value ** argv)
{
/* SQL function:
/ spatialite_version()
................................................................................
*/
    char *errMsg = NULL;
    int ret;
    int transaction = 0;
    const char *xmode = NULL;
    int retval;
    char *sql;

    sqlite3 *sqlite = sqlite3_context_db_handle (context);
    GAIA_UNUSED ();		/* LCOV_EXCL_LINE */
    if (argc == 1)
      {
	  if (sqlite3_value_type (argv[0]) == SQLITE_TEXT)
	    {
		xmode = (const char *) sqlite3_value_text (argv[0]);
................................................................................
    sqlite3_free (sql);
    if (retval != 1)
	goto error;
    if (!createAdvancedMetaData (sqlite))
	goto error;

#ifdef ENABLE_LIBXML2		/* only if LibXML2 support is available */

    if (xmode != NULL)
      {
	  if (strcasecmp (xmode, "NONE") == 0
	      || strcasecmp (xmode, "EMPTY") == 0)
	      ;
	  else



	    {
		/* executing CreateIsoMetadataTables() */
		sql = sqlite3_mprintf ("SELECT CreateIsoMetadataTables()");
		retval = do_execute_sql_with_retval (sqlite, sql, &errMsg);
		sqlite3_free (sql);
		if (retval != 1)
		    goto error;
	    }
      }
#endif

/* executing CreateRasterCoveragesTable() */
    sql = sqlite3_mprintf ("SELECT CreateRasterCoveragesTable()");
    retval = do_execute_sql_with_retval (sqlite, sql, &errMsg);
    sqlite3_free (sql);
................................................................................
				fnct_spatialite_version, 0, 0,
				splite_close_callback);
#else
    sqlite3_create_function_v2 (db, "spatialite_version", 0,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
				fnct_spatialite_version, 0, 0, 0);
#endif











    sqlite3_create_function_v2 (db, "spatialite_target_cpu", 0,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
				fnct_spatialite_target_cpu, 0, 0, 0);
    sqlite3_create_function_v2 (db, "check_strict_sql_quoting", 0,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
				fnct_check_strict_sql_quoting, 0, 0, 0);







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







>







 







>




<
<
>
>
>
|
|
|
|
|
|
|
<







 







>
>
>
>
>
>
>
>
>
>







317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
....
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
....
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011


3012
3013
3014
3015
3016
3017
3018
3019
3020
3021

3022
3023
3024
3025
3026
3027
3028
.....
48086
48087
48088
48089
48090
48091
48092
48093
48094
48095
48096
48097
48098
48099
48100
48101
48102
48103
48104
48105
48106
48107
48108
48109
	  sqlite3_free (x.z);
      }
    else
      {
	  sqlite3_result_text (context, x.z, x.nUsed, sqlite3_free);
      }
}

static void
fnct_createMissingSystemTables (sqlite3_context * context, int argc,
				sqlite3_value ** argv)
{
/* SQL function:
/ CreateMissingSystemTables()
/  or
/ CreateMissingSystemTables(bool relaxed)
/  or
/ CreateMissingSystemTables(bool relaxed, bool transaction)
/
/ creates all missing system tables required by version 5
/ returns 1 on success
/ RAISES AN EXCEPTION on failure or on invalid arguments
*/
    int relaxed = 0;
    int transaction = 0;
    int ret;
    char *err_msg = NULL;
    char *msg = NULL;
    sqlite3 *sqlite = sqlite3_context_db_handle (context);
    struct splite_internal_cache *cache = sqlite3_user_data (context);
    GAIA_UNUSED ();		/* LCOV_EXCL_LINE */
    if (argc >= 1)
      {
	  if (sqlite3_value_type (argv[0]) != SQLITE_INTEGER)
	      goto invalid_arg1;
	  relaxed = sqlite3_value_int (argv[0]);
      }
    if (argc >= 2)
      {
	  if (sqlite3_value_type (argv[1]) != SQLITE_INTEGER)
	      goto invalid_arg2;
	  transaction = sqlite3_value_int (argv[1]);
      }

    ret =
	createMissingSystemTables (sqlite, cache, relaxed, transaction,
				   &err_msg);
    if (ret <= 0)
	goto error;
    msg =
	sqlite3_mprintf ("successfully executed (%d Table%s been created)", ret,
			 (ret == 1) ? " has" : "s have");
    updateSpatiaLiteHistory (sqlite, "*** CreateMissingSystemTables ***", NULL,
			     msg);
    sqlite3_free (msg);
    sqlite3_result_int (context, ret);
    return;

  invalid_arg1:
    msg =
	"CreateMissingSystemTables exception - first argument (relaxed) expected to be an INTEGER.";
    sqlite3_result_error (context, msg, -1);
    return;

  invalid_arg2:
    msg =
	"CreateMissingSystemTables exception - second argument (transaction) expected to be an INTEGER.";
    sqlite3_result_error (context, msg, -1);
    return;

  error:
    if (err_msg == NULL)
	msg =
	    sqlite3_mprintf
	    ("CreateMissingSystemTables exception - Unknown failure reason.");
    else
      {
	  msg =
	      sqlite3_mprintf ("CreateMissingSystemTables exception - %s.",
			       err_msg);
	  sqlite3_free (err_msg);
      }
    sqlite3_result_error (context, msg, -1);
    sqlite3_free (msg);
    return;
}

static void
fnct_spatialite_version (sqlite3_context * context, int argc,
			 sqlite3_value ** argv)
{
/* SQL function:
/ spatialite_version()
................................................................................
*/
    char *errMsg = NULL;
    int ret;
    int transaction = 0;
    const char *xmode = NULL;
    int retval;
    char *sql;
    int ok_isometa = 0;
    sqlite3 *sqlite = sqlite3_context_db_handle (context);
    GAIA_UNUSED ();		/* LCOV_EXCL_LINE */
    if (argc == 1)
      {
	  if (sqlite3_value_type (argv[0]) == SQLITE_TEXT)
	    {
		xmode = (const char *) sqlite3_value_text (argv[0]);
................................................................................
    sqlite3_free (sql);
    if (retval != 1)
	goto error;
    if (!createAdvancedMetaData (sqlite))
	goto error;

#ifdef ENABLE_LIBXML2		/* only if LibXML2 support is available */
    ok_isometa = 1;
    if (xmode != NULL)
      {
	  if (strcasecmp (xmode, "NONE") == 0
	      || strcasecmp (xmode, "EMPTY") == 0)


	      ok_isometa = 0;
      }
    if (ok_isometa)
      {
	  /* executing CreateIsoMetadataTables() */
	  sql = sqlite3_mprintf ("SELECT CreateIsoMetadataTables()");
	  retval = do_execute_sql_with_retval (sqlite, sql, &errMsg);
	  sqlite3_free (sql);
	  if (retval != 1)
	      goto error;

      }
#endif

/* executing CreateRasterCoveragesTable() */
    sql = sqlite3_mprintf ("SELECT CreateRasterCoveragesTable()");
    retval = do_execute_sql_with_retval (sqlite, sql, &errMsg);
    sqlite3_free (sql);
................................................................................
				fnct_spatialite_version, 0, 0,
				splite_close_callback);
#else
    sqlite3_create_function_v2 (db, "spatialite_version", 0,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
				fnct_spatialite_version, 0, 0, 0);
#endif

    sqlite3_create_function_v2 (db, "CreateMissingSystemTables", 0,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_createMissingSystemTables, 0, 0, 0);
    sqlite3_create_function_v2 (db, "CreateMissingSystemTables", 1,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_createMissingSystemTables, 0, 0, 0);
    sqlite3_create_function_v2 (db, "CreateMissingSystemTables", 2,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, cache,
				fnct_createMissingSystemTables, 0, 0, 0);

    sqlite3_create_function_v2 (db, "spatialite_target_cpu", 0,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
				fnct_spatialite_target_cpu, 0, 0, 0);
    sqlite3_create_function_v2 (db, "check_strict_sql_quoting", 0,
				SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
				fnct_check_strict_sql_quoting, 0, 0, 0);

Changes to src/srsinit/srs_init.c.

372
373
374
375
376
377
378
379
380
381
382

383
384
385
386
387
388
389
...
391
392
393
394
395
396
397
398


399
400
401
402
403
404
405
...
407
408
409
410
411
412
413
414



415
416
417
418
419
420
421
      {
	  pn = p->next;
	  free_epsg_def (p);
	  p = pn;
      }
}

static void
create_spatial_ref_sys_aux (sqlite3 * handle)
{
/* just in case, we'll create the SPATIAL_REF_SYS_AUX table */

    const char *sql = "CREATE TABLE IF NOT EXISTS spatial_ref_sys_aux (\n"
	"\tsrid INTEGER NOT NULL PRIMARY KEY,\n"
	"\tis_geographic INTEGER,\n"
	"\thas_flipped_axes INTEGER,\n"
	"\tspheroid TEXT,\n"
	"\tprime_meridian TEXT,\n"
	"\tdatum TEXT,\n"
................................................................................
	"\tunit TEXT,\n"
	"\taxis_1_name TEXT,\n"
	"\taxis_1_orientation TEXT,\n"
	"\taxis_2_name TEXT,\n"
	"\taxis_2_orientation TEXT,\n"
	"\tCONSTRAINT fk_sprefsys FOREIGN KEY (srid) "
	"\tREFERENCES spatial_ref_sys (srid))";
    sqlite3_exec (handle, sql, NULL, NULL, NULL);


/* creating the SPATIAL_REF_SYS_ALL view */
    sql = "CREATE VIEW IF NOT EXISTS spatial_ref_sys_all AS\n"
	"SELECT a.srid AS srid, a.auth_name AS auth_name, "
	"a.auth_srid AS auth_srid, a.ref_sys_name AS ref_sys_name,\n"
	"b.is_geographic AS is_geographic, "
	"b.has_flipped_axes AS has_flipped_axes, "
	"b.spheroid AS spheroid, b.prime_meridian AS prime_meridian, "
................................................................................
	"b.axis_1_name AS axis_1_name, "
	"b.axis_1_orientation AS axis_1_orientation,\n"
	"b.axis_2_name AS axis_2_name, "
	"b.axis_2_orientation AS axis_2_orientation,\n"
	"a.proj4text AS proj4text, a.srtext AS srtext\n"
	"FROM spatial_ref_sys AS a\n"
	"LEFT JOIN spatial_ref_sys_aux AS b ON (a.srid = b.srid)";
    sqlite3_exec (handle, sql, NULL, NULL, NULL);



}

static int
populate_spatial_ref_sys (sqlite3 * handle, int mode, int metadata)
{
/* populating the EPSG dataset into the SPATIAL_REF_SYS table */
    struct epsg_defs *first = NULL;







|



>







 







|
>
>







 







|
>
>
>







372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
...
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
...
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
      {
	  pn = p->next;
	  free_epsg_def (p);
	  p = pn;
      }
}

SPATIALITE_PRIVATE int
create_spatial_ref_sys_aux (sqlite3 * handle)
{
/* just in case, we'll create the SPATIAL_REF_SYS_AUX table */
int ret;
    const char *sql = "CREATE TABLE IF NOT EXISTS spatial_ref_sys_aux (\n"
	"\tsrid INTEGER NOT NULL PRIMARY KEY,\n"
	"\tis_geographic INTEGER,\n"
	"\thas_flipped_axes INTEGER,\n"
	"\tspheroid TEXT,\n"
	"\tprime_meridian TEXT,\n"
	"\tdatum TEXT,\n"
................................................................................
	"\tunit TEXT,\n"
	"\taxis_1_name TEXT,\n"
	"\taxis_1_orientation TEXT,\n"
	"\taxis_2_name TEXT,\n"
	"\taxis_2_orientation TEXT,\n"
	"\tCONSTRAINT fk_sprefsys FOREIGN KEY (srid) "
	"\tREFERENCES spatial_ref_sys (srid))";
    ret = sqlite3_exec (handle, sql, NULL, NULL, NULL);
	if (ret != SQLITE_OK)
	  return 0;
/* creating the SPATIAL_REF_SYS_ALL view */
    sql = "CREATE VIEW IF NOT EXISTS spatial_ref_sys_all AS\n"
	"SELECT a.srid AS srid, a.auth_name AS auth_name, "
	"a.auth_srid AS auth_srid, a.ref_sys_name AS ref_sys_name,\n"
	"b.is_geographic AS is_geographic, "
	"b.has_flipped_axes AS has_flipped_axes, "
	"b.spheroid AS spheroid, b.prime_meridian AS prime_meridian, "
................................................................................
	"b.axis_1_name AS axis_1_name, "
	"b.axis_1_orientation AS axis_1_orientation,\n"
	"b.axis_2_name AS axis_2_name, "
	"b.axis_2_orientation AS axis_2_orientation,\n"
	"a.proj4text AS proj4text, a.srtext AS srtext\n"
	"FROM spatial_ref_sys AS a\n"
	"LEFT JOIN spatial_ref_sys_aux AS b ON (a.srid = b.srid)";
    ret = sqlite3_exec (handle, sql, NULL, NULL, NULL);
	if (ret != SQLITE_OK)
	  return 0;
    return 1;
}

static int
populate_spatial_ref_sys (sqlite3 * handle, int mode, int metadata)
{
/* populating the EPSG dataset into the SPATIAL_REF_SYS table */
    struct epsg_defs *first = NULL;

Changes to src/stored_procedures/stored_procedures.c.

1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
....
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
	  gaia_sql_proc_set_error (cache, errmsg);
	  sqlite3_free (errmsg);
	  return 0;
      }

/* creating Triggers supporting STORED_PROCEDURES */
    sprintf (sql,
	     "CREATE TRIGGER storproc_ins BEFORE INSERT ON stored_procedures\n"
	     "FOR EACH ROW BEGIN\n"
	     "SELECT RAISE(ROLLBACK, 'Invalid \"sql_proc\": not a BLOB of the SQL Procedure type')\n"
	     "WHERE SqlProc_IsValid(NEW.sql_proc) <> 1;\nEND");
    ret = sqlite3_exec (handle, sql, NULL, NULL, &errMsg);
    if (ret != SQLITE_OK)
      {
	  char *errmsg =
................................................................................
	      sqlite3_mprintf ("gaia_stored_create \"storproc_ins\": %s",
			       sqlite3_errmsg (handle));
	  gaia_sql_proc_set_error (cache, errmsg);
	  sqlite3_free (errmsg);
	  return 0;
      }
    sprintf (sql,
	     "CREATE TRIGGER storproc_upd BEFORE UPDATE OF sql_proc ON stored_procedures\n"
	     "FOR EACH ROW BEGIN\n"
	     "SELECT RAISE(ROLLBACK, 'Invalid \"sql_proc\": not a BLOB of the SQL Procedure type')\n"
	     "WHERE SqlProc_IsValid(NEW.sql_proc) <> 1;\nEND");
    ret = sqlite3_exec (handle, sql, NULL, NULL, &errMsg);
    if (ret != SQLITE_OK)
      {
	  char *errmsg =







|







 







|







1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
....
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
	  gaia_sql_proc_set_error (cache, errmsg);
	  sqlite3_free (errmsg);
	  return 0;
      }

/* creating Triggers supporting STORED_PROCEDURES */
    sprintf (sql,
	     "CREATE TRIGGER IF NOT EXISTS storproc_ins BEFORE INSERT ON stored_procedures\n"
	     "FOR EACH ROW BEGIN\n"
	     "SELECT RAISE(ROLLBACK, 'Invalid \"sql_proc\": not a BLOB of the SQL Procedure type')\n"
	     "WHERE SqlProc_IsValid(NEW.sql_proc) <> 1;\nEND");
    ret = sqlite3_exec (handle, sql, NULL, NULL, &errMsg);
    if (ret != SQLITE_OK)
      {
	  char *errmsg =
................................................................................
	      sqlite3_mprintf ("gaia_stored_create \"storproc_ins\": %s",
			       sqlite3_errmsg (handle));
	  gaia_sql_proc_set_error (cache, errmsg);
	  sqlite3_free (errmsg);
	  return 0;
      }
    sprintf (sql,
	     "CREATE TRIGGER IF NOT EXISTS storproc_upd BEFORE UPDATE OF sql_proc ON stored_procedures\n"
	     "FOR EACH ROW BEGIN\n"
	     "SELECT RAISE(ROLLBACK, 'Invalid \"sql_proc\": not a BLOB of the SQL Procedure type')\n"
	     "WHERE SqlProc_IsValid(NEW.sql_proc) <> 1;\nEND");
    ret = sqlite3_exec (handle, sql, NULL, NULL, &errMsg);
    if (ret != SQLITE_OK)
      {
	  char *errmsg =

Changes to test/sql_stmt_libxml2_tests/Makefile.am.

15
16
17
18
19
20
21










22
23
24
25
26
27
28
	addparentid7.testcase \
	createisometa1.testcase \
	createisometa2.testcase \
	createisometa3.testcase \
	createisometa4.testcase \
	createisometa5.testcase \
	createisometa6.testcase \










	createstyling1.testcase \
	createstyling2.testcase \
	createstyling3.testcase \
	createstyling4.testcase \
	createstyling5.testcase \
	createstyling6.testcase \
	createstyling7.testcase \







>
>
>
>
>
>
>
>
>
>







15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
	addparentid7.testcase \
	createisometa1.testcase \
	createisometa2.testcase \
	createisometa3.testcase \
	createisometa4.testcase \
	createisometa5.testcase \
	createisometa6.testcase \
	createmissingtables1.testcase \
	createmissingtables2.testcase \
	createmissingtables3.testcase \
	createmissingtables4.testcase \
	createmissingtables5.testcase \
	createmissingtables6.testcase \
	createmissingtables7.testcase \
	createmissingtables8.testcase \
	createmissingtables9.testcase \
	createmissingtables10.testcase \
	createstyling1.testcase \
	createstyling2.testcase \
	createstyling3.testcase \
	createstyling4.testcase \
	createstyling5.testcase \
	createstyling6.testcase \
	createstyling7.testcase \

Changes to test/sql_stmt_libxml2_tests/Makefile.in.

267
268
269
270
271
272
273










274
275
276
277
278
279
280
	addparentid7.testcase \
	createisometa1.testcase \
	createisometa2.testcase \
	createisometa3.testcase \
	createisometa4.testcase \
	createisometa5.testcase \
	createisometa6.testcase \










	createstyling1.testcase \
	createstyling2.testcase \
	createstyling3.testcase \
	createstyling4.testcase \
	createstyling5.testcase \
	createstyling6.testcase \
	createstyling7.testcase \







>
>
>
>
>
>
>
>
>
>







267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
	addparentid7.testcase \
	createisometa1.testcase \
	createisometa2.testcase \
	createisometa3.testcase \
	createisometa4.testcase \
	createisometa5.testcase \
	createisometa6.testcase \
	createmissingtables1.testcase \
	createmissingtables2.testcase \
	createmissingtables3.testcase \
	createmissingtables4.testcase \
	createmissingtables5.testcase \
	createmissingtables6.testcase \
	createmissingtables7.testcase \
	createmissingtables8.testcase \
	createmissingtables9.testcase \
	createmissingtables10.testcase \
	createstyling1.testcase \
	createstyling2.testcase \
	createstyling3.testcase \
	createstyling4.testcase \
	createstyling5.testcase \
	createstyling6.testcase \
	createstyling7.testcase \

Added test/sql_stmt_libxml2_tests/createmissingtables1.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
CreateMissingSystemTables - NULL relaxed
:memory: #use in-memory database
SELECT CreateMissingSystemTables(NULL);
1 # rows (not including the header row)
1 # columns
CreateMissingSystemTables(NULL)
CreateMissingSystemTables exception - first argument (relaxed) expected to be an INTEGER.

Added test/sql_stmt_libxml2_tests/createmissingtables10.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
CreateMissingSystemTables - INTEGER relaxed, INTEGER transaction
:memory: #use in-memory database
SELECT CreateMissingSystemTables(0, 1);
1 # rows (not including the header row)
1 # columns
CreateMissingSystemTables(0, 1)
1

Added test/sql_stmt_libxml2_tests/createmissingtables2.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
CreateMissingSystemTables - TEXT relaxed
:memory: #use in-memory database
SELECT CreateMissingSystemTables('no');
1 # rows (not including the header row)
1 # columns
CreateMissingSystemTables('no')
CreateMissingSystemTables exception - first argument (relaxed) expected to be an INTEGER.

Added test/sql_stmt_libxml2_tests/createmissingtables3.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
CreateMissingSystemTables - BLOB relaxed
:memory: #use in-memory database
SELECT CreateMissingSystemTables(zeroblob(4));
1 # rows (not including the header row)
1 # columns
CreateMissingSystemTables(zeroblob(4))
CreateMissingSystemTables exception - first argument (relaxed) expected to be an INTEGER.

Added test/sql_stmt_libxml2_tests/createmissingtables4.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
CreateMissingSystemTables - DOUBLE relaxed
:memory: #use in-memory database
SELECT CreateMissingSystemTables(1.5);
1 # rows (not including the header row)
1 # columns
CreateMissingSystemTables(1.5)
CreateMissingSystemTables exception - first argument (relaxed) expected to be an INTEGER.

Added test/sql_stmt_libxml2_tests/createmissingtables5.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
CreateMissingSystemTables - INTEGER relaxed
:memory: #use in-memory database
SELECT CreateMissingSystemTables(1);
1 # rows (not including the header row)
1 # columns
CreateMissingSystemTables(1)
1

Added test/sql_stmt_libxml2_tests/createmissingtables6.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
CreateMissingSystemTables - INTEGER relaxed, NULL transaction
:memory: #use in-memory database
SELECT CreateMissingSystemTables(1, NULL);
1 # rows (not including the header row)
1 # columns
CreateMissingSystemTables(1, NULL)
CreateMissingSystemTables exception - second argument (transaction) expected to be an INTEGER.

Added test/sql_stmt_libxml2_tests/createmissingtables7.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
CreateMissingSystemTables - INTEGER relaxed, TEXT transaction
:memory: #use in-memory database
SELECT CreateMissingSystemTables(0, 'no');
1 # rows (not including the header row)
1 # columns
CreateMissingSystemTables(0, 'no')
CreateMissingSystemTables exception - second argument (transaction) expected to be an INTEGER.

Added test/sql_stmt_libxml2_tests/createmissingtables8.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
CreateMissingSystemTables - INTEGER relaxed, BLOB transaction
:memory: #use in-memory database
SELECT CreateMissingSystemTables(1, zeroblob(4));
1 # rows (not including the header row)
1 # columns
CreateMissingSystemTables(1, zeroblob(4))
CreateMissingSystemTables exception - second argument (transaction) expected to be an INTEGER.

Added test/sql_stmt_libxml2_tests/createmissingtables9.testcase.















>
>
>
>
>
>
>
1
2
3
4
5
6
7
CreateMissingSystemTables - INTEGER relaxed, DOUBLE transaction
:memory: #use in-memory database
SELECT CreateMissingSystemTables(0, 1.5);
1 # rows (not including the header row)
1 # columns
CreateMissingSystemTables(0, 1.5)
CreateMissingSystemTables exception - second argument (transaction) expected to be an INTEGER.

Changes to test/sql_stmt_tests/Makefile.

129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
...
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
AS = as
AUTOCONF = autoconf
AUTOHEADER = autoheader
AUTOMAKE = automake-1.16
AWK = gawk
CC = gcc
CCDEPMODE = depmode=gcc3
CFLAGS = -Wall -Wextra -Wunused -pedantic -g -O0 -I/home/sandro/Scaricati/gdal/include -fprofile-arcs -ftest-coverage -g
CPP = gcc -E
CPPFLAGS = 
CXX = g++
CXXCPP = g++ -E
CXXDEPMODE = depmode=gcc3
CXXFLAGS = -g -O2
CYGPATH_W = echo
................................................................................
GREP = /usr/bin/grep
INSTALL = /usr/bin/install -c
INSTALL_DATA = ${INSTALL} -m 644
INSTALL_PROGRAM = ${INSTALL}
INSTALL_SCRIPT = ${INSTALL}
INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
LD = /usr/bin/ld -m elf_x86_64
LDFLAGS = -L/home/sandro/Scaricati/gdal/lib
LIBOBJS = 
LIBS = -lminizip -lrttopo -lfreexl -lproj -lsqlite3 -lz -lsqlite3  -L/usr/lib64 -lgeos_c
LIBTOOL = $(SHELL) $(top_builddir)/libtool
LIBXML2_CFLAGS = -I/usr/include/libxml2 
LIBXML2_LIBS = -lxml2 
LIPO = 
LN_S = ln -s







|







 







|







129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
...
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
AS = as
AUTOCONF = autoconf
AUTOHEADER = autoheader
AUTOMAKE = automake-1.16
AWK = gawk
CC = gcc
CCDEPMODE = depmode=gcc3
CFLAGS = -Wall -Wextra -Wunused -pedantic -g -O0 -fprofile-arcs -ftest-coverage -g
CPP = gcc -E
CPPFLAGS = 
CXX = g++
CXXCPP = g++ -E
CXXDEPMODE = depmode=gcc3
CXXFLAGS = -g -O2
CYGPATH_W = echo
................................................................................
GREP = /usr/bin/grep
INSTALL = /usr/bin/install -c
INSTALL_DATA = ${INSTALL} -m 644
INSTALL_PROGRAM = ${INSTALL}
INSTALL_SCRIPT = ${INSTALL}
INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
LD = /usr/bin/ld -m elf_x86_64
LDFLAGS = 
LIBOBJS = 
LIBS = -lminizip -lrttopo -lfreexl -lproj -lsqlite3 -lz -lsqlite3  -L/usr/lib64 -lgeos_c
LIBTOOL = $(SHELL) $(top_builddir)/libtool
LIBXML2_CFLAGS = -I/usr/include/libxml2 
LIBXML2_LIBS = -lxml2 
LIPO = 
LN_S = ln -s