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