• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..03-May-2022-

demo/H20-Nov-2007-11465

lib/H20-Nov-2007-161,753121,695

t/H20-Nov-2007-9,1877,267

ChangesH A D20-Nov-200716.8 KiB431358

MANIFESTH A D04-Jan-20072.6 KiB115113

META.ymlH A D20-Nov-2007764 2321

Makefile.PLH A D22-Oct-20062.2 KiB6241

READMEH A D20-Nov-200728.2 KiB753559

TODOH A D20-Nov-200718.8 KiB451387

README

1Copyright (C) 2003-2006 Jeffrey I Cohen.  All rights reserved, worldwide.
2
3NAME
4
5  Genezzo - an extensible database system
6
7DESCRIPTION
8
9  The Genezzo modules implement a hierarchy of persistent
10  hashes using a fixed amount of memory and disk.  This system is
11  designed to be easily configured and extended with custom functions,
12  persistent storage representations, and novel data access methods.
13  In its current incarnation it supports a limited subset of SQL with
14  a command line tool [gendba] and a partial DBI-style interface.
15
16REQUIREMENTS
17
18 Perl 5.6
19
20INSTALLATION
21
22  If you can read this, then you figured out how to uncompress and
23  untar the archive.
24
25  perl Makefile.PL  # constructs the makefile
26  make
27  make test
28  make install      # (as superuser [optional])
29
30
31  If you install Genezzo, you should be able to run the line-mode tool
32  directly by typing "gendba.pl" at the command line.
33
34  You also should be able to run scripts from the directory containing
35  this file, something like:
36
37  perl -Iblib/lib lib/Genezzo/gendba.pl
38
39
40USAGE
41
42  line mode available via (/usr/bin) gendba.pl.
43  Try:
44
45    gendba.pl -help
46    gendba.pl -man
47
48  or:
49
50    perl -Iblib/lib lib/Genezzo/gendba.pl -help
51    perl -Iblib/lib lib/Genezzo/gendba.pl -man
52
53  for more information.
54
55  The GenDBI module supports a subset of DBI-style calls.  See
56  dbi_example.pl for some sample usage.
57
58  Try:
59
60    perl -Iblib/lib demo/dbi_example.pl # runs an example
61    perldoc Genezzo::GenDBI
62
63  for more information.
64
65  The simplest way to create an instance of a Genezzo database is to use:
66
67    gendba.pl -init
68
69  This command will create a new database and login to the
70  command-line.
71
72SQL SUPPORT -- see LIMITATIONS
73
74  EXPRESSIONS: The Genezzo parser can handle expressions composed of
75               column names, numeric or quoted string constants,
76               logical constants like TRUE, FALSE and NULL,
77               concatenation, scalar functions, and basic arithmetic
78               like '+', '-', '*', '/'.  However, logical expressions
79               using AND, OR, and NOT are only legal in the WHERE clause.
80
81  INSERT:
82    INSERT INTO tablename VALUES (expr [, expr ...]);
83    INSERT INTO tablename (colname [, colname ...]) VALUES (expr [, expr ...]);
84    INSERT INTO tablename SELECT ... FROM ...
85
86  UPDATE:
87    UPDATE tablename SET colname = expr [, colname = expr ...] [WHERE ...]
88
89  DELETE:
90    DELETE FROM tablename [WHERE ...]
91
92  SELECT:  The Genezzo parser can parse complex SELECT statements,
93           but the execution engine can only handle simple SELECTS
94           and basic joins.
95
96    SELECT * FROM tablename [WHERE ...]
97    SELECT COUNT(*) FROM tablename
98    SELECT ECOUNT(*) FROM tablename
99    SELECT * FROM t1, t2 WHERE t1.col1 = t2.col1
100
101    SELECT expr [[AS] column_alias] [, expr [[AS] column_alias]]
102      FROM tablename
103      [WHERE ...]
104
105  CREATE TABLE:
106    CREATE TABLE tablename (colname coltype [, colname coltype ...]);
107
108  CREATE INDEX:
109    CREATE INDEX iname on tablename (colname [, colname ...]);
110
111  ALTER TABLE ADD CONSTRAINT: supports primary and unique key and
112    check constraints.  NOT NULL and foreign keys are not currently
113    supported, though you can implement NOT NULL as
114    CHECK (colname IS NOT NULL).  The CHECK expression is equivalent
115    to a WHERE clause.  A table can have multiple CHECK constraints,
116    but currently only one key constraint.
117
118    ALTER TABLE tablename
119          ADD [CONSTRAINT constraint_name]
120              PRIMARY KEY (colname [, colname ...]);
121    ALTER TABLE tablename
122          ADD [CONSTRAINT constraint_name]
123              UNIQUE (colname [, colname ...]);
124    ALTER TABLE tablename
125          ADD [CONSTRAINT constraint_name]
126              CHECK (conditional_expression);
127
128  ADDFILE: Not really a SQL command, but an extension to grow the
129           datafiles.  See "addfile help".
130
131  DROP: drop a table or index.
132  COMMIT: write changes to disk.
133  SYNC: write changes to disk like "commit", but don't end a transaction.
134  ROLLBACK: discard all uncommitted changes.
135
136  DESCRIBE:
137    DESCRIBE tablename
138
139  EXPLAIN PLAN: dump parsing and plan information for any SQL command,
140                including CREATE and ALTER TABLE.  Does not require a
141                "plan table".  Can perform partial explanations for
142                invalid statements, such as missing tables/columns, etc.
143                Example - "explain plan for select * from t1;"
144                or even complex sql like:
145                Explain plan for
146                  select * from t1
147                           where c1 in (select avg(c2) from t2)
148                           having avg(c3) > ((select min(c4)
149                                             from (select c5 from t3
150                                                   union
151                                                   select c6 from t4)
152                                             ) + 5) * 7 / min(c7)     ;
153
154  STARTUP/SHUTDOWN:
155
156LIMITATIONS
157
158  General: No locking/multiuser support, bind variables,
159  incomplete DBI support.
160
161  SELECT: Simple queries only -- no ORDER BY, GROUP BY,
162          HAVING, subqueries, set functions (UNION, INTERSECT).
163          Only basic FROM clause joins: FROM t1, t2, ... are
164          supported.
165          No aggregation functions other than COUNT(*), ECOUNT(*).
166          COUNT and ECOUNT do not accept a WHERE clause.
167
168  ALTER TABLE: no foreign key, NULL/NOT NULL constraints.
169
170  CREATE TABLE: Only numeric and character datatypes are accepted.
171                Datatype length and precision are not enforced.
172                Numeric columns will accept arbitrary character input,
173                but will attempt to use numeric (versus character)
174                comparisons.  No table or column constraints.
175                No CREATE TABLE AS SELECT.
176
177EXAMPLES
178
179  Some very basic SQL create/drop/describe table, select, insert, update
180  and delete syntax is supported, and like standard SQL, table and
181  column names are case-insensitive unless quoted.  More complex SQL
182  parses, but is ignored.  While many scalar SQL functions are available,
183  the only supported aggregation functions are count(*) and ecount(*),
184  a non-blocking count estimation function.  The database also
185  supports commit to force changes to disk, and a crude rollback.
186  NOTE: Data definition (such as create table or ct) must be manually
187  committed to keep the database in a consistent state.  Uncommitted
188  inserts and updates will only be block-consistent -- there is no
189  guarantee that the data will get flushed to disk, and no
190  guarantee whether the changes will or will not take effect.
191
192    rem  Some simple SELECTs
193    select * from _col1;
194    select rid, rownum, tname, colname from _col1;
195    select count(*) from _col1;
196    select ecount(*) from _col1;
197
198    rem  SELECTs with WHERE, perl and SQL style.
199    select * from _tab1 where tname =~ m/col/;
200    select * from _tab1 where tid < 5;
201    select * from _tab1 where numcols > 3 AND numcols < 6;
202
203    rem basic joins
204    select * from _tab1, _col1  where _tab1.tid = _col1.tid
205     and _tab1.tname =~ m/col/;
206
207    rem  Column aliases and Expressions
208    select tid as Table_ID, tname Name, (tid+1)/2 from _tab1;
209
210    rem  Basic INSERT
211    insert into test1 values ('a','b','c','d');
212    insert into test1(col2, col1) values ('a','b','c','d');
213
214    rem CREATE TABLE and INSERT...SELECT
215    create table test2(col1 char, col2 char);
216    insert into test2 (col1) select col1 from test1;
217
218    rem  DELETE with WHERE
219    delete from test1 where col1 < 'bravo' and col2 > 5;
220
221    rem  UPDATE with WHERE (no subqueries supported)
222    update test2 set col2 = 'foo' where col2 is null;
223
224    commit
225
226  By default, the database will autostart -- the gendba.pl command will
227  connect to an active, updateable instance.  The shutdown command will
228  reset the database to a read-only mode that only provides read access
229  to certain dictionary tables.  The startup command will restart the
230  database.
231
232  The Genezzo parser also supports the Feeble query language, as
233  described by gendba.pl -man.  Briefly, the commands are ct (create
234  table), dt (drop table), i (insert), u (update), d (delete), s
235  (select).  The following example creates a table EMP with two
236  columns, ENAME (as character) and ID (as number), inserts five rows,
237  and counts them.
238
239    ct EMP ENAME=c ID=n
240    i EMP bob 1 orville 2 wilbur 3 harry 4 luke 5
241    s EMP count
242    s EMP ecount
243    commit
244
245  While the SQL update and delete commands support a WHERE clause, the
246  Feeble "u" and "d" commands only work via rowid.  For example:
247
248    gendba 10> s EMP rid rownum *
249    rid     rownum  ename   id
250    ___     ______  _____   __
251
252    1/33/1  1       bob     1
253    1/33/2  2       orville 2
254    1/33/3  3       wilbur  3
255    1/33/4  4       harry   4
256    1/33/5  5       luke    5
257
258    5 rows selected.
259
260    gendba 11> d EMP 1/33/1
261    deleted 1 rows from table emp.
262
263    gendba 12> u EMP 1/33/5 margo 66
264    updated 1 rows in table emp.
265
266    gendba 13> !10
267    s EMP rid rownum *
268    rid     rownum  ename   id
269    ___     ______  _____   __
270
271    1/33/2  1       orville 2
272    1/33/3  2       wilbur  3
273    1/33/4  3       harry   4
274    1/33/5  4       margo   66
275
276    4 rows selected.
277
278  The default database is stored in a fixed-size 160K file.  You can
279  change the default filesize and the blocksize at database
280  initialization time.  For example:
281
282    gendba.pl -init -define blocksize=8k -define dbsize=10M
283
284  to create a database with a 10 megabyte datafile using 8K blocks.
285  By default, this file is a fixed size, but it can be set to grow
286  using the "increase_by" settings added in version 0.18.  Also, you can
287  add additional files to your database using the "addfile" command.  By
288  default, each file is double the size of the previous.  Type "addfile
289  help" for more options.
290
291
292NEW FEATURES - Indexed Tables
293
294  Version 0.13 introduces an indexed-table type.  An indexed table
295  treats the first column in the table definition as a unique, not-null
296  primary key.  Note that an "Indexed Table" is distinct from an
297  ordinary table with a separate index, where you can assign a separate
298  index object to a particular column or group of columns.
299
300    gendba 9> ct EMP index id=n name=c
301    Create Table : emp
302    with unique index option
303    tablename : emp
304    column id : n (primary key)
305    column name : c
306    table emp created
307
308    gendba 10> i EMP 1 bob 2 orville 3 wilbur 4 harry 5 luke
309    inserted 5 rows into table emp.
310
311    gendba 11> s EMP rid *
312    rid     id      name
313    ___     __      ____
314
315    1       1       bob
316    2       2       orville
317    3       3       wilbur
318    4       4       harry
319    5       5       luke
320
321    5 rows selected.
322
323    gendba 12> i EMP 1 bob 2 orville 3 wilbur 4 harry 5 luke
324    whisper: duplicate key 1
325    Failed to insert row 1 in table emp at lib/Genezzo/gendba.pl line 230
326    inserted 0 rows into table emp.
327
328    gendba 13> select tid, tname, otype from _tab1 where tname = 'emp'
329    tid     tname   otype
330    ___     _____   _____
331
332    14      emp     IDXTAB
333
334    1 row selected.
335
336
337  Notice that the first column is marked as a primary key when the
338  table is created, and the rids for indexed tables are the primary key,
339  not a physical block address.
340
341  Indexed tables have an object type of IDXTAB in the data dictionary
342  -- conventional tables are marked as TABLE.
343
344  WHERE clause processing has been enhanced to use equality predicates
345  (e.g. "SELECT * from EMP where id = 2") to drive index scans.  Any
346  series of "AND"ed predicates is a candidate for an efficient index
347  search, but the use of an OR currently requires a full table scan.
348
349  CAVEATS:  The index performance is pretty poor, for a couple reasons.
350  It should improve a lot.
351
352NEW FEATURES - Indexes
353
354  Users can now define their own indexes.  The dictionary
355  automatically maintains indexes on its own tables.  In order to create
356  an index called EMP_I1 on the ID column of table EMP, the command is:
357
358      Create Index EMP_I1 on EMP (ID)
359
360  You can have arbitrary combinations of numeric and character keys.
361  RESTRICTIONS: only one index per table currently.  Index keys must
362  be less than one-half of the db blocksize.
363
364  In version 0.15, the query engine will use the index to drive the
365  row fetch for a SELECT if the WHERE clause specifies an equality
366  predicate on the primary key.  For example:
367
368      Select * from EMP where ID = 5
369
370  uses an index.  In general, additional predicates may accompany the
371  equality expression as long as they are ANDed:
372
373      Select * from EMP where ID = 5 and ENAME =~ m/BOB/
374
375  However, the presence of ORs causes the plan to revert to a full
376  table scan:
377
378      Select * from EMP where ID = 5 or ID = 6
379
380  All user-defined indexes are non-unique.  Unique indexes should be
381  created as unique constraints (fixed in version 0.22) using
382  ALTER TABLE.
383
384NEW FEATURES - automatic tablespace and file growth
385
386  In version 0.18, datafiles are no longer a fixed size.  The column
387  "increase_by" in table _tsfiles controls the behavior: if this column
388  is blank, null, or zero, the datafile size is fixed.  If
389  "increase_by" is a non-zero number, the datafile will attempt to grow by
390  that many bytes if it runs out of free extents.  If "increase_by" is a
391  percentage like "50%", the datafile is extended by the current size
392  multiplied by this percentage.  The AddFile command now takes
393  "increase_by" as an optional argument.
394
395  Also in version 0.18, each tablespace can be configured to
396  automatically create new datafiles when the current datafile runs out
397  of free extents.  The column "addfile" in table _tspace controls the
398  behavior: if the column is blank or null, then the tablespace must be
399  extended manually.  If the "addfile" column contains a valid argument
400  list for the AddFile command, then this command will get invoked when
401  all of the current datafiles are full.  Note that the datafiles can be
402  of a fixed size, or use the new "increase_by" parameter to grow to some
403  maximum size (currently 2G).
404
405  Prior to version 0.69, the simplest way to alter tablespace settings
406  was the "bigdb.sql" script.  This script is supplanted in version 0.69
407  by the alter_ts() utility function.  The command:
408    select alter_ts() from dual;
409  will, by default, upgrade the SYSTEM tablespace to use a base file
410  size of 10M which automatically grows in 50% increments.  For more
411  information, in gendba.pl line-mode please type:
412    help area=utility_functions alter_ts
413
414NEW FEATURES - ALTER TABLE ADD CONSTRAINT
415
416  Version 0.20 supports ALTER TABLE ADD CONSTRAINT <name> CHECK (<check-text>).
417
418  The check-text is any basic where clause predicate.  Example:
419
420    gendba 3> create table testcon (col1 c, col2 n);
421    table testcon created
422
423    gendba 4> alter table testcon add constraint cn1
424              check ((col2 > 5) AND col1 =~ m/(a|b|c)/)
425    Added constraint cn1 to table testcon
426
427    gendba 5> insert into testcon values ('a', 7);
428    inserted 1 row into table testcon.
429
430    gendba 6> insert into testcon values ('b', 8);
431    inserted 1 row into table testcon.
432
433    gendba 7> insert into testcon values ('d', 8);
434    WARNING: violated constraint cn1
435    must satisfy (col2 > 5) AND col1 =~ m/(a|b|c)/
436    WARNING: Failed to insert row 1 in table testcon
437    inserted 0 rows into table testcon.
438
439    gendba 8> insert into testcon values ('a', 1);
440    WARNING: violated constraint cn1
441    must satisfy (col2 > 5) AND col1 =~ m/(a|b|c)/
442    WARNING: Failed to insert row 1 in table testcon
443    inserted 0 rows into table testcon.
444
445
446  Version 0.22 supports
447    ALTER TABLE ADD CONSTRAINT <name> UNIQUE (<column-list>)
448    and
449    ALTER TABLE ADD CONSTRAINT <name> PRIMARY KEY (<column-list>
450
451  Version 0.22 only supports a single constraint or single index per
452  table, but version 0.23 supports multiple constraints and indexes
453  on a table.
454
455  Need to extend to fully support NULL/NOT NULL, FOREIGN KEY, plus
456  ENABLE/DISABLE.
457
458NEW FEATURES - System/User Extensibility
459
460  Version 0.25 of Genezzo supports database extensibility.  See
461  Genezzo::Havok for more details.  The script "havok.sql" (now
462  deprecated) can be used to add extensibility tables to your database.
463  In version 0.58 a new function HavokUse supercedes the havok.sql
464  script, and the table user_extend is supplanted in version 0.59 by
465  Havok::UserFunctions.
466
467NEW FEATURES - Improved error reporting, handling
468
469  Version 0.31 error reporting has been significantly reworked to be
470  more compatible with DBI.  In particular, Genezzo::GenDBI->connect now
471  takes an optional attribute hash with PrintError and RaiseError, so
472  it will print messages using warn() or die().  In addition, it also
473  supports a GZERR argument is used to replace the internal Genezzo
474  error handlers.  More documentation exists in GenDBI.pm.  The DBI
475  standard err and errstr aren't supported yet.
476
477NEW FEATURES - backward compatiblity
478
479  Version 0.32 supports a compatibility matrix - it can support version 0.31
480  databases.  Genezzo can now maintain a list of which versions use the same
481  database format.  Need to extend this capability to get automatic upgrade
482  between different database revisions.
483
484NEW FEATURES - database export, rollback, quoted strings,
485               dynamic system extensions
486
487  Version 0.33 introduces genexpl.pl, a very, very basic data export
488  utility.  A "rollback" command is now available, which will discard
489  all in-memory changes and replace them with the previous committed
490  results.  Note that the buffer cache will automatically flush data
491  to disk when it is full, so rollback will not be able to restore
492  data in this case.  Single-quoted strings in SQL expressions now
493  support backslash quoting, so 'foo\\bar\'s' is interpreted as
494  foo\bar's.  Finally, a new Havok module called SysHook supports
495  extensions to basic Genezzo database functions.  SysHook is
496  restructured in version 0.34.
497
498NEW FEATURES - multiline SQL statements
499
500  Version 0.38 allows multiline SQL statements for SELECT, INSERT,
501  UPDATE, DELETE, and EXPLAIN in the gendba interactive line mode.
502  These statements must be terminated by a semicolon.
503
504NEW FEATURES - Improved Parser
505
506  Version 0.39 uses a new parser based upon Parse::RecDescent
507  for SELECT statements.  The new parser is stricter about
508  quoting conventions and identifier names -- standard identifiers
509  must start with an alpha character, or be specified in double quotes.
510  Only identifiers can be unquoted.  String literals must be in single
511  quotes.  The parser does make an exception for dictionary tables like
512  _tab1 and _col1, which do *not* need to quoted.  Boolean operations
513  must use AND and OR, not && and ||.  || is the SQL string concatenation
514  operation.  The count estimation function ECOUNT must be specified as
515  ecount(*) in the select list.
516
517  While the parser is smarter, the execution phase is not improved.  The
518  only supported aggregation functions are count(*) or ecount(*) in the
519  select list.  Having, Group By, and Order By are still missing.
520
521  Version 0.40 allows arbitrary expressions in SELECT lists, e.g:
522
523      Select tid+5/2 from _tab1;
524
525  Version 0.41 adds support for the literals TRUE, FALSE, and NULL,
526  and extends the new parser to cover ALTER TABLE, DELETE, and INSERT.
527  INSERT can now handle arbitrary expressions, e.g:
528
529     Insert into mytable values (1+1, 2*2, 3/4);
530
531  Version 0.42 adds arbitrary expression support to UPDATE, and marks
532  the complete switchover to the new parser.
533
534  Version 0.43 adds case-insensitive table and column names.
535
536NEW FEATURES - Raw Device support
537  Version 0.44 and 0.45 add support for raw io devices.
538
539NEW FEATURES - Additional User-supplied Preferences and File Header Info
540  In Version 0.47, users can supply arbitrary command-line definitions
541  for the dictionary preference table or fileheader info using
542  -define and -fileheader_define, respectively.
543
544NEW FEATURES - Object-Oriented SysHooks
545  In Version 0.47, a single package can load multiple functions as
546  a set of class methods, versus package methods.
547
548NEW FEATURES - Tablespaces
549  In Version 0.51, users can create additional tablespaces (collections
550  of datafiles for storage) for tables and indexes.  By default, all
551  tables and indexes are created in the SYSTEM tablespace.  The command
552  "CREATE TABLESPACE tablespace_name" creates a new, empty tablespace.
553  You must add files to the tablespace use "addfile tsname=..." or "af
554  tsname=..." before it can be used.  See "addfile help" for more details.
555  CREATE TABLE and CREATE INDEX now take a new TABLESPACE option.  Note
556  that key constraints on a table inherit its tablespace.  A table or
557  index can only be stored in a single tablespace, and they cannot be
558  moved to a different tablespace.  Additional files may be added to any
559  tablespace at any time.  Currently, there is no support for DROP
560  TABLESPACE, or taking tablespace offline.  Example:
561
562  gendba 1> create tablespace ts1
563  gendba 2> addfile tsname=ts1
564  gendba 3> create table mytab (col1 char) tablespace ts1
565
566NEW FEATURES - Joins
567  In Version 0.52, basic joins are supported.
568
569NEW FEATURES - DUAL table
570
571  In version 0.58, Genezzo provides a single-row DUAL table which is
572  useful for evaluating expressions, e.g.:
573
574  gendba 1>  select (((5+5)/4)*32) from dual;
575  (((5+5)/4)*32)
576  ______________
577
578  80
579
580  1 row selected.
581
582
583NEW FEATURES - HavokUse function for System/User Extensibility
584
585  In version 0.58, the HavokUse function supercedes the havok.sql and
586  syshook.sql scripts.  HavokUse operates on Havok modules in a
587  fashion analogous to the way perl "use" loads perl modules. Havok
588  modules now use a metadata document similar to the MakeMaker META.yml
589  which lists module dependencies, table definitions, etc.  For example,
590  to load Genezzo::Havok::SysHook, use the command:
591
592      Select HavokUse('Genezzo::Havok::SysHook') from dual;
593
594  If the havok and sys_hook tables do not exist, HavokUse will create
595  and update these tables.  If the tables already exist, HavokUse will
596  do nothing, but return successfully.  See the Havok module for more
597  details.  Note that the "select" statement is now invoking
598  dictionary actions which may create and update new tables, and which
599  may need to be committed.  Also, prior to version 0.71, HavokUse
600  only performs partial initialization -- it is still necessary to
601  commit, shutdown and restart to activate the new Havok modules.
602  Modules created after version 0.71 can use add_user_function and
603  add_sys_hook to dynamically load new functionality.
604
605NEW FEATURES - Havok::UserFunctions, standard SQL scalar functions
606
607  Previously, all standard perl functions could be invoked in a SQL
608  statement, and additional SQL functions were optionally added via
609  Havok::UserExtend.  In version 0.59, Havok::UserExtend has been
610  deprecated and replaced with Havok::UserFunctions, and Genezzo only
611  supports functions defined in the new user_functions table.  This
612  table is preloaded when the database is created with many common
613  perl and sql functions.
614
615  The perl functions which are available in SQL are:
616
617    chomp, chop, chr, crypt, index, lc, lcfirst, length, ord, pack,
618    reverse, rindex, sprintf, substr, uc, ucfirst, abs, atan2, cos, exp,
619    hex, int, log10 (to avoid confusion between natural log and base10),
620    oct, rand, sin, sqrt, srand, and perl_join (which is renamed to
621    avoid a conflict with the SQL JOIN operation).
622
623  The SQL string functions are concat, greatest, initcap, least, lower,
624  and upper.  The SQL math functions are cosh, ceil, floor, ln, sinh, tan,
625  and tanh (also note many standard SQL math functions are identical to their
626  perl counterparts, which are listed above).  The SQL conversion
627  functions are ascii, instr, and nvl.
628
629  Version 0.67 has many fixes plus added support for the string
630  functions lpad, ltrim, rpad, rtrim, translate, replace, and soundex
631  and the math functions mod, power, round, sign, trunc, logN.  Please
632  see Genezzo::Havok::SQLScalar or "help area=sql_functions" for more
633  information.
634
635  Version 0.69 adds the utility function add_user_function() which
636  simplifies the creation of new sql functions. In gendba.pl
637  line-mode please type:
638    help area=utility_functions add_user_function
639  for more information.
640
641NEW FEATURES - improved genexp.pl
642
643  The version 0.60 database export (genexp.pl) now correctly handles table
644  constraints and indexes.
645
646NEW FEATURES - Feeble/SQL compatible case-sensitivity
647
648  Prior to version 0.63, Feeble commands (ct, d, u, s) did not match
649  the SQL behavior for case-insensitive identifiers.  For example, the
650  Feeble command:
651    "ct EMP COL1=c"
652  would create a table called EMP (uppercase) with a column COL1, while
653  the SQL command:
654    "create table EMP (COL1 char(10))"
655  would create a table called emp (lowercase) with a column col1.
656  This discrepancy would require the use of quoted identifiers in SQL
657  in order to reference uppercase or mixed case table or column names.
658  To facilitate interoperablity between Feeble and SQL, Feeble now
659  matches the SQL usage and legal naming restrictions for unquoted,
660  case-insensitive names, and uppercase or mixed case names are only
661  available using SQL quoted identifiers.  Feeble does not support
662  quoted names.
663
664NEW FEATURES - additional comparison functions IN, LIKE
665
666  In version 0.68, basic support for IN and LIKE comparison is
667  supported.  IN only supports expression lists, not subqueries, e.g:
668
669  Select * from tab1 where col1 IN ('a', 'b', 'c');
670  Select * from tab2 where col2 NOT IN (22,33,44);
671
672  The LIKE operator supported as a function (versus a separate clause),
673  e.g:
674
675  Select * from tab1 where col3 LIKE ('foo%');
676  Select * from tab1 where col3 NOT LIKE ('#_foo_', '#');
677
678  The first argument to LIKE is a pattern which can take two special
679  matching characters -- a percent ('%') which is a wildcard (any number
680  of characters, including zero), and an underscore ('_') which matches
681  a single character.  The optional second argument is an ESCAPE
682  character.  If the '%' or '_' is prefixed with the ESCAPE character it
683  is treated as a literal.  Note that LIKE comparisons are
684  case-sensitive.
685
686NEW FEATURES - additional utility functions add_user_function, alter_ts
687
688  In version 0.69 utility functions simplify the tasks of adding new
689  user functions, and altering tablespaces for large databases.
690  In gendba.pl line-mode please type:
691    help area=utility_functions long=alter_ts add_user_function
692  for more information.
693
694NEW FEATURES - improved HELP
695
696  In version 0.70 the help system is re-organized and enhanced.  The
697  new help supports regex lookup, loadable help modules, and online
698  support for the SQL functions.  In gendba.pl line-mode, try:
699    Help Help
700  or
701    Help area=sql
702  for more information.
703
704NEW FEATURES - dynamic system hooks
705
706  Prior to version 0.71, the Genezzo::Havok::SysHook module required
707  direct modification of the sys_hook table.  In version 0.71, the
708  function add_sys_hook can be used to dynamically add system hooks to a
709  running Genezzo instance.  In gendba.pl line-mode please type:
710    help area=system_hooks add_sys_hook
711  for more information.
712
713NEW FEATURES - self-managed extents
714
715  In version 0.72 the extent code keeps better track of block usage,
716  allowing the more efficient re-use of space from deleted rows.
717
718INCOMPATIBLE CHANGES
719
720  Version 0.72 dictionary and block format is incompatible with
721  previous releases.  No upgrade path is supported.
722  Version 0.48 thru 0.50 are compatible.
723
724SEE ALSO
725
726  The project homepage at http://www.genezzo.com
727
728
729AUTHOR
730
731  Original author: Jeffrey I Cohen <jcohen@genezzo.com>
732
733  Copyright (c) 2003-2007 Jeffrey I Cohen.  All rights reserved.
734
735    This program is free software; you can redistribute it and/or modify
736    it under the terms of the GNU General Public License as published by
737    the Free Software Foundation; either version 2 of the License, or
738    any later version.
739
740    This program is distributed in the hope that it will be useful,
741    but WITHOUT ANY WARRANTY; without even the implied warranty of
742    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
743    GNU General Public License for more details.
744
745    You should have received a copy of the GNU General Public License
746    along with this program; if not, write to the Free Software
747    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
748
749Address bug reports and comments to: jcohen@genezzo.com
750
751For more information, please visit the Genezzo homepage
752at http://www.genezzo.com
753