2004-08-16 Darren Duncan * Release 0.38. * From now on, SQL::SyntaxModel and its primary distribution will have identical version/release numbers, to help avoid public confusion as to which distribution releases contain which SQL::SyntaxModel versions. This distribution's Makefile.pl now uses "VERSION_FROM => 'lib/SQL/SyntaxModel.pm'" rather than "VERSION => N". As such, SyntaxModel.pm will always have its own version number incremented for any distribution changes, even if the changes are otherwise entirely in other files. With this first such release, SyntaxModel.pm is now at v0.38, up from v0.24 in the previous release. * Other new code file versions are: en.pm v0.10. * Renamed both SyntaxModel.pm methods Node.test_mandatory_attributes() and Container.with_all_nodes_test_mandatory_attributes() to [Node|Container].test_deferrable_constraints(); the new name better describes their purpose. Corresponding en.pm updates. Updated the Container method so that it now skips over Nodes that are not in "Well Known" status. Rewrote the POD descriptions for both methods also. * Added new Container.deferrable_constraints_are_tested() method and corresponding "deferrable constraints are tested" Container property which keeps track of whether any changes were made to a Container's Nodes since the last Container.test_deferrable_constraints() call. This property is used to make the module faster in the face of redundant calls to the test_def*() method; you can now place SSM data validation test calls for safety all over your program without seeing a corresponding performance hit. Updated about a dozen other methods to read or set this property. * Other minor documentation updates. 2004-08-06 Darren Duncan * Release 0.37. * Updated external dependencies on Locale::KeyedText to v0.06. * Updated all distribution code that makes use of UNIVERSAL::isa() to test for valid objects so that it no longer incorrectly "passes" literal strings whose string values match the class names of valid objects. For each test, "UNIVERSAL::isa($obj,'')" was replaced with "ref($obj) and UNIVERSAL::isa($obj,'')". Before the fixes, code that UNIVERSAL::isa() was supposed to guard would eventually die with the standard Perl error "Can't use string ('') as a HASH ref", rather than elegantly dealing with the bad input value. * Updated Language.pod and SyntaxModel.pm (now v0.24) and en.pm (now v0.09). Updated the 'command' Node type (and the command_type enumerated list) so that it can now possibly take anywhere from zero to two command_args, depending on the command_type; renamed Node attribute 'command_arg' to 'command_arg_1' and added 'command_arg_2'; the 2 new attributes are conditionally mandatory, the old 1 was always mandatory; added 4 corresponding user messages. * Most 'DB_*' commands now take 'catalog_link' Nodes as their argument(s) rather than 'catalog' Nodes. These commands now take zero arguments: DB_LIST, DB_CLOSE, DB_PING, TRA_OPEN, TRA_CLOSE, SCHEMA_LIST, USER_LIST; they know what to act on based on the context they are called in. All '*_CLONE' and '*_MOVE' commands now take 2 arguments, both of the same type. Updated Language.pod, SyntaxModel.pm, t_SQL_SyntaxModel.pm for this. * Documentation updates to the SYNOPSIS in SyntaxModel.pm, and the FEATURE SCOPE AND STANDARDS COMPLIANCE section in Language.pod, and a few other small changes. * Updated all user-text strings in en.pm so that the module-class name appears at the start of each, to the left of the method names. This should make it easier for users to know which code file among many candidates is generating any error messages they see. * Updated SQL::SyntaxModel::API_C to bring the sample C code in "CONTENT OF libSQLSM.h" partially up to date with the core distro files. Rebuilt the sqlsm_dt_literal_type and sqlsm_dt_char_enc_type enum definitions so they are identical to those in Language.pod. Updated the sqlsm_dt_node struct definition to match the attr names and orders in SyntaxModel.pm. No other changes were made; the missing sqlsm_dt_container attrs are still missing. 2004-07-04 Darren Duncan * Release 0.36. * Updated Language.pod and SyntaxModel.pm (now v0.23). Mainly this was to update the 'command_type' enumerated value list and the 'command' Node type. The 'command_arg' attribute of 'command' Nodes now has a major type of 'node ref' rather than 'literal'; SQL::SyntaxModel now enforces that 'command_arg' is a valid Node, while before any integer was accepted, even if it didn't match a Node. It also enforces the correct type of Node, depending on what the 'command_type' is. * Updated SQL::SyntaxModel to add support for a Node ref attribute to be defined as flexible, accepting more than one type of Node for linking, depending on circumstances. Currently, said Node ref attribute can be associated with an enumerated value attribute in the same Node, and be constrained based on its value. Generally speaking, the module's non-deferred input checks will allow a ref to (or id of) any type of Node to be set as the flexible attribute's value; it is mainly during the deferred input tests that the attribute will be constrained to exactly one Node type, as it is only then that we can guarantee the enumerated value we have to consult is also set. These methods were updated to handle the new data-driven feature: expected_node_ref_attribute_type(), set_node_ref_attribute(), put_in_container(), test_mandatory_attributes(); also, a new private method _resolve_variable_node_ref_attribute_type() was added. Added three new messages to en.pm (now v0.08) for the new feature. * Other minor fixes and updates were made to code and documentation. 2004-06-26 Darren Duncan * Release 0.35. * Updated external dependencies on Locale::KeyedText to v0.04. * Updated Language.pod and SyntaxModel.pm (now v0.22). Changed the position of 'CAST' in the basic_expr_type enumerated list. Updated the 'view_expr' and 'routine_expr' Nodes to move the 'domain' attribute to just above the 'lit_val' attribute. Also, 'domain' is now mandatory for 'expr_type' of ['LIT', 'CAST'], rather than just 'CAST'. As a result of this change, external SQL generating code now has the necessary info for how to properly quote or escape literal values being inserted into SQL. * Updated SyntaxModel.pm to add a new "next free node id" hash ref Container property. Added new Container method get_next_free_node_id() to fetch the property. Updated the Node methods set_node_id() and put_in_container() to update the property. The new method can be used as a convenient sequence generator for new Node Ids; one suggested time for using it is when building a SQL::SyntaxModel by scanning a database schema. Added two new messages to en.pm (now v0.07) for the new method. Updated the test suite in t_SQL_SyntaxModel.pm to use the new sequence generator, thereby simplifying the test code. Corresponding SSM SYNOPSIS update. 2004-06-21 Darren Duncan * Release 0.34. * Updated Language.pod and SyntaxModel.pm (now v0.21). Split the single 'view' attribute 'c_merge_type' into 'compound_op' and 'distinct_rows'; the latter can be used with any view type. Changed the values list of the compound_operator enumerated type from [DISTINCT, ALL, UNION, INTERSECT, EXCLUSIVE, EXCEPT] to [UNION, DIFFERENCE, INTERSECTION, EXCLUSION]. * Added support for OLAP extensions, whose details are stored in 'view_expr' Nodes associated with a group-by clause. Added these 3 'standard_func' enumerated values: [GB_SETS, GB_RLUP, GB_CUBE]. Added 'LIST' to the 'basic_expr_type' enumerated list. * Added "routine_type" enumerated value "BLOCK" and removed the two values [LOOP, CONDITION]. Added "basic_stmt_type" enumerated values [BLOCK, RETURN] and removed "LOGIC" (plus documentation re DECLARE, SET). Removed "standard_proc" enumerated values "RETURN" (redundant with a basic type), and "ROUTINE" (likewise redundant); added 3 values [LOOP, CONDITION, LOGIC]; split list in two, as the second part isn't rigorously defined yet. Renamed "routine_stmt" Node attribute 'c_routine' to 'block_routine'. * Renamed 'routine' boolean attr 'trigger_per_row' to 'trigger_per_stmt'; its meaning is now reversed, and 'per row' is now the default action. * Small updates to t_SQL_SyntaxModel.pm that keep the tests compatible with the aforementioned changes, and to SQL::SyntaxModel's SYNOPSIS. * A few other small documentation fixes or updates. 2004-05-20 Darren Duncan * Release 0.33. * Updated Language.pod and SyntaxModel.pm (now v0.20) to remove all traces of the 'view_context' enumerated value list, as well as the same-named attribute in 'view' Nodes. These were long known as redundant, and now they are gone. References to 'view_context' were also purged from the test suite, and SyntaxModel.pm's SYNOPSIS. * Split the existing SYNOPSIS in SyntaxModel.pm beneath 2 sub-headings (head2), the first having the Perl code examples and the second having the XML dump of a model. Then added a largeish third sub-section which demonstrates what actual SQL statements can be generated from parts of a model, including multiple variants of CREATE and UPDATE statements. I hope that this will help ground my otherwise abstract documentation in reality, making SQL::SyntaxModel easier to adopt for use. This update was inspired by Jarrell Dunson, who wrote me asking for examples of how to use SQL::SyntaxModel. 2004-05-19 Darren Duncan * Release 0.32. * Multiple corresponding updates in Language.pod, SyntaxModel.pm (now v0.19), and en.pm (now v0.06), mainly to better enforce data correctness. * Updated SyntaxModel.pm (and en.pm) to correct a long-standing bug where users were not prevented from creating circular virtual reference chains between Nodes, such as "A is the child of B and B is the child of A". Previously, users could create such arrangements whereby any code that wanted to traverse the Node tree (such as to generate XML) would have gone into an infinite loop, crossing the same Nodes repeatedly. To fix the bug, these "setter" Node methods were updated to throw an error exception when users try to create a circular reference: set_node_ref_attribute(), set_parent_node_attribute_name(); also added a comment to put_in_container() which says why no such test is needed there; added a related comment to add_child_node(). Added 2 related messages to en.pm. The corresponding BUGS documentation POD was removed from SyntaxModel.pm. * Corresponding to the above change, a new method test_circular_ref_prevention() was added to t_SQL_SyntaxModel.pm, and 2 new numbered tests that use it were added to SQL_SyntaxModel.t. * Updated SyntaxModel.pm to enforce conditionally-mandatory (MC*) constraints on Node attributes that were long described in Language.pod. Previously, only the always-mandatory (MA) constraints were enforced, and lots of common omissions were allowed through unchecked. Some new MC-type constraints were also added to Language.pod and SyntaxModel.pm. There are now 3 main types of MC tests, which are 'MCEE', 'MCR' and 'PP'; see Language.pod (top of NODE TYPES) for descriptions. To implement the change, added some code to the test_mandatory_attributes() method, and added a large amount of data which the new code uses to the %NODE_TYPES hash. Note that, as before, all mandatory-value constraints are deferrable, and they are only enforced if you call the test_mandatory_attributes() method. Added 8 related messages to en.pm and updated 3 others. A few related fixes in the test suite. * The 'routine_expr' attributes 'src_[arg/var]' were renamed to 'routine_[arg/var]' so they match their 'view_expr' counterparts. * A variety of other minor code/data/docs bug fixes or changes were made. * Since the extra validation adds considerably more work to the otherwise same interface, I thought some speed comparisons were in order. These effectively time the running of the test suite 1000 times. 'MakeAndBreak' builds a new Container full of Nodes and then destroys it; it does not invoke the deferrable tests. 'TestMandatory' takes a single identical pre-stuffed Container and invokes the deferrable tests. 'ConvertToXML' takes an identical Container and dumps it to XML. Results for SQL-SyntaxModel-0.31: Benchmark: timing 1000 iterations of MakeAndBreak, TestMandatory, ConvertToXML... MakeAndBreak: 23 wallclock secs (23.23 usr + 0.00 sys = 23.23 CPU) @ 43.05/s (n=1000) TestMandatory: 2 wallclock secs ( 2.01 usr + 0.00 sys = 2.01 CPU) @ 497.51/s (n=1000) ConvertToXML: 16 wallclock secs (15.56 usr + 0.00 sys = 15.56 CPU) @ 64.27/s (n=1000) Results for SQL-SyntaxModel-0.32: Benchmark: timing 1000 iterations of MakeAndBreak, TestMandatory, ConvertToXML... MakeAndBreak: 32 wallclock secs (32.28 usr + 0.00 sys = 32.28 CPU) @ 30.98/s (n=1000) TestMandatory: 8 wallclock secs ( 7.57 usr + 0.00 sys = 7.57 CPU) @ 132.10/s (n=1000) ConvertToXML: 16 wallclock secs (15.70 usr + 0.00 sys = 15.70 CPU) @ 63.69/s (n=1000) To explain the results: The new circular reference prevention code makes 'MakeAndBreak' about 1/3 slower; it could probably stand for some optimization later. All the mandatory-value checks only affect 'TestMandatory', which now takes about 4 times as long. 'ConvertToXML' is the same as before, and none of the changes should affect it. Also, there were no detectable memory leaks in both versions. 2004-05-12 Darren Duncan * Release 0.31. * Multiple corresponding updates in Language.pod and SyntaxModel.pm (now v0.18) that are partly of the re-ordering type. Some are incompatible. * Now 'domain' Nodes are catalog schema objects like tables or sequence generators; they have 'schema' Nodes as their primary parents, and they exist in the 'blueprints' portion of the Node tree rather than 'elements'. As a result of this change, you can generate schema-specific named domains rather than just inlining their data type definitions in such places as table column definitions. Domain-related documentation has also been moved to a location further down, just above that for sequence generators. * Removed the 'trigger' Node type and merged its attributes into the 'routine' Node type. Now routines that are triggers can be direct child Nodes of tables or views (triggers on views were not supported before). Added new enumerated type 'basic_trigger_event' that is used by the new 'routine' in place of six boolean flags that the old 'trigger' used. The old solution let you write a trigger once and have it run under multiple circumstances; the new solution requires you to pick just one event (eg before insert), as SQL-2003 requires. * Added 'view_src_arg' Node type which allows named subqueries to be passed arguments when they are used in a view's "from" clause. Also added 'FROM' to the 'view_part' enumerated value list, and added new attribute 'view_src_arg' to 'view_expr' Nodes. * Added a set of command_type enumerated values for working with named schemas and domains (list, add, remove, etc). * Split the 'privilege' Node into 'privilege_on' and 'privilege_for' Nodes; the second is a child Node of the first. Added a few more attributes to 'privilege_on' Nodes. Added a few privilege_type enumerated values. * The 'name' attribute of "schema" and "view" Nodes is now mandatory. * Added curs_view attribute to routine_arg Nodes. Added curs_for_update attribute to routine_var Nodes. With routine_stmt Nodes, renamed c_view attribute to view_for_dml, and added curs_arg/var attributes. * Added comment by view_expr Nodes regarding the INTO clause. * Updated t_SQL_SyntaxModel.pm and the SYNOPSIS in SyntaxModel.pm to account for the move of 'domain' from 'elements' to 'schema', and the rename of 'c_view' to 'view_for_dml', and the now mandatory view names. 2004-05-01 Darren Duncan * Release 0.30. * This is a "middle of development" release that includes a large number of changes, some of which are only partially implemented. It exists largely so that I can have a reliable backup for (and historical record of) the last 3 weeks of in-progress work. Some changes made now are incompatible with 0.29, and likewise will be further changes to come in 0.31. * Multiple corresponding updates in Language.pod and SyntaxModel.pm (now v0.17) that are partly influenced by my close studying of the SQL-2003 standard, and partly by my attempts to build a SQL generator. * Updated documentation to say that the SQL-2003 standard is now the focus of influence rather than SQL-1999 (or SQL-1992). * Expanded the support for temporal data types / domains. The 2 simple_data_type enumerated values of [DATETIME, INTERVAL] have become 5 values of [DATM_FULL, DATM_DATE, DATM_TIME, INTRVL_YM, INTRVL_DT]. Also added new 'domain' Node attribute 'with_zone'. * Expanded the support for table join operators. The 2 join_operator enumerated values of [EQUAL, LEFT] have become 5 values of [CROSS, INNER, LEFT, RIGHT, FULL] (last 3 are outer-joins, INNER is renamed from EQUAL). As with before, there is no concept of a "natural" join at this level. * Expanded the view_part enumerated value list to include WINDOW and other matters for consideration. * Expanded the basic_expr_type enumerated value list to add CAST and SEQN. Added new attributes to "view_expr" and "routine_expr" Nodes named 'domain' and 'sequence' that are respectively used with CAST and SEQN. * Updated the standard_func enumerated value list in several ways. Removed the TO_* casting functions, which for now are replaced by the CAST basic expression type. Renamed NVL to COALESCE, EXP to POWER. Added NOT_NULL, ABS. Removed MIN, MAX, AVG as non-aggregate functions. Removed CROWID, CROWNUM, CLEVEL, which will be replaced later. Renamed the G* aggregate functions to the same names minus the leading 'G'. Added EXISTS. * Added documentation regarding the recursiveness of views. * The 'name' attribute of "routine" Nodes is now mandatory. * Other small documentation updates in the same two files. For example, "sequences" are now called "sequence generators". * No updates were made to the test suite since it did not test the portions of SQL::SyntaxModel that changed; the old suite still passes all its tests. 2004-04-10 Darren Duncan * Release 0.29. * Updated Language.pod and SyntaxModel.pm (now v0.16) to transpose the 'domain' Node attributes 'num_precision' and 'num_scale'. Up until now I was using 'scale' to mean the same thing that everyone else uses 'precision' to mean, and vice-versa; now I am using the terms to mean the same things as is widely accepted. Further updated the documentation for all 'num_*' attributes, removed any conditional mandatory constraints on them. Made a small corresponding change in t_SQL_SyntaxModel.pm. * Updated the 'command_type' enumerated type to include a set of 'SEQU_*' commands that look like the ones for 'TABLE_*', 'VIEW_*', 'ROUTINE_*'. Other minor changes in Language.pod and SyntaxModel.pm. 2004-03-22 Darren Duncan * Release 0.28. * There are 4 distributions being released simultaneously that all have the same release number of 0.28; this is one of them. They are: SQL-SyntaxModel-0.28, SQL-SyntaxModel-ByTree-0.28, SQL-SyntaxModel-SkipID-0.28, Rosetta-0.28. Each of the latter 3 is dependant on the first 1. These 4 distributions cumulatively have almost identical contents to the Rosetta-0.27 distribution, which is their sole progenitor; that older distribution has hereby been split into 4 pieces which will now be developed independently from each other. All 4 new distributions inherit the external dependency on Locale-KeyedText-0.03. * While those of Rosetta-0.27 were taken as a starting point, these CPAN standard files have been changed to either a large or a small extent as appropriate so that they represent the new 0.28 distribution: ChangeLog, INSTALL, Makefile.PL, MANIFEST, ReadMe, TODO. (META.yml is generated.) * This ChangeLog file has been truncated to exclude the details from releases 0.01 thru 0.27, as they aren't very useful going forward and take up a lot of space (about 90 kilobytes). If you want to read those details then please look at an archived Rosetta-0.27 distribution, which is the last one to have them. * The distribution you are looking at now is the first one to bear the name SQL-SyntaxModel. For historical posterity, this is its file manifest: - ChangeLog - INSTALL - lib/SQL/SyntaxModel.pm - lib/SQL/SyntaxModel/API_C.pod - lib/SQL/SyntaxModel/L/en.pm - lib/SQL/SyntaxModel/Language.pod - lib/t_SQL_SyntaxModel.pm - LICENSE - Makefile.PL - MANIFEST - META.yml Module meta-data (added by MakeMaker) - ReadMe - t/SQL_SyntaxModel.t - TODO * All modules with version numbers have seen theirs incremented by 0.01 compared to Rosetta-0.27, and all modules or scripts that use them now require the new numbers; said modules did not have any other significant changes. In this distribution, SQL::SyntaxModel is now v0.15 and SQL::SyntaxModel::L::en is now v0.05. * A few other minor updates were made to several files. 2004-03-21 Darren Duncan * Rosetta-0.27, the last version of the distribution prior to its 4-way split, was released on CPAN. 2003-01-27 Darren Duncan * Rosetta-0.02, the first version of the distribution under that name, was released on CPAN. 2003-01-05 Darren Duncan * DBIx-Portable-0.01, the only version of the Rosetta distribution under its previous name, was released on CPAN. 2002-11-12 Darren Duncan * Began development on the modules which became the pre-split Rosetta distribution as their own entity that is separate from my application, for open-source distribution on CPAN. The modules were to comprise an RDBMS-generic DB framework for any application to use. * Modules based on a template created by h2xs 1.18. 2002-07-28 * Posted the first significant update to the second prototype, which added an index or cache for data that was expensive to calculate for each page request, and involved rewriting about a fourth of the perl code. 2002-06-07 * Posted to my website the second public prototype demo of the new self-proprietary database driven application, whose database schema, user interface, feature set, and Perl application code was almost completely rewritten. The new version explicitly had separate modules for database communication and the web interface logic, with MySQL-specific code and database generic or data dictionary code in separate files, and separate files for parts of the web interface. The program used the same generic CPAN modules as in the first prototype, DBI/MySQL and CGI::Portable. 2001-11-24 * Posted the last update to the first prototype. 2001-07-12 * Posted to my website the first public prototype demo of a new self-proprietary database driven application, which is like a cross between a multimedia metadata catalogue and a repository for historical or genealogical data. This application contained the first prototypes of code that ended up in these modules. All of this application's code, for database communication and web interface logic, was situated in a single module, with the rest of the program being more generic CPAN modules like DBI (and DBD for MySQL) and CGI::Portable. 2000-05-17 * Requested MySQL database privileges on my web host so I have something to start developing, testing and deploying database driven applications on.