From 348784efc0f9486e991bc4461fa8d4e389a90358 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 29 May 2000 20:41:49 +0000 Subject: [PATCH] :-) (CVS 6) FossilOrigin-Name: 1517f85243b63511c2ceb73a10453c5ae56d3428 --- COPYRIGHT | 340 +++++++++++++++++++++++++++++++++++++++++++++++ Makefile.in | 24 +++- README | 36 +++++ configure | 136 +++++++++---------- configure.in | 4 +- manifest | 23 ++-- manifest.uuid | 2 +- src/parse.y | 303 +++++++++++++++++++++++++++++++++++++++++ src/tclsqlite.c | 56 +++++++- test/crttbl.test | 92 +++++++++++++ test/tester.tcl | 86 ++++++++++++ 11 files changed, 1021 insertions(+), 81 deletions(-) create mode 100644 COPYRIGHT create mode 100644 README create mode 100644 src/parse.y create mode 100644 test/crttbl.test create mode 100644 test/tester.tcl diff --git a/COPYRIGHT b/COPYRIGHT new file mode 100644 index 0000000000..60549be514 --- /dev/null +++ b/COPYRIGHT @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Makefile.in b/Makefile.in index d3c3f220c1..ff1be06991 100644 --- a/Makefile.in +++ b/Makefile.in @@ -29,6 +29,14 @@ GDBM_FLAGS = @TARGET_GDBM_INC@ # LIBGDBM = @TARGET_GDBM_LIBS@ +# Compiler options needed for programs that use the TCL library. +# +TCL_FLAGS = @TARGET_TCL_INC@ + +# The library that programs using TCL must link against. +# +LIBTCL = @TARGET_TCL_LIBS@ + # Compiler options needed for programs that use the readline() library. # READLINE_FLAGS = -DHAVE_READLINE=@TARGET_HAVE_READLINE@ @TARGET_READLINE_INC@ @@ -44,8 +52,7 @@ LIBOBJ = build.o dbbe.o main.o parse.o tokenize.o util.o vdbe.o where.o # This is the default Makefile target. The objects listed here # are what get build when you type just "make" with no arguments. # -all: libsqlite.a sqlite.h sqlite -# libtclsqlite.a tclsqlite +all: libsqlite.a sqlite.h sqlite libsqlite.a: $(LIBOBJ) $(AR) libsqlite.a $(LIBOBJ) @@ -103,7 +110,19 @@ vdbe.o: $(TOP)/src/vdbe.c $(HDR) where.o: $(TOP)/src/where.c $(HDR) $(TCC) $(GDBM_FLAGS) -c $(TOP)/src/where.c +gdbmdump: $(TOP)/tool/gdbmdump.c + $(TCC) $(GDBM_FLAGS) -o gdbmdump $(TOP)/tool/gdbmdump.c $(LIBGDBM) + +tclsqlite: $(TOP)/src/tclsqlite.c libsqlite.a + $(TCC) $(TCL_FLAGS) -DTCLSH=1 -o tclsqlite \ + $(TOP)/src/tclsqlite.c libsqlite.a $(LIBGDBM) $(LIBTCL) + +regression: tclsqlite + for i in $(TOP)/test/*.test; do ./tclsqlite $$i; done + + TARBALL = \ + sqlite/COPYRIGHT \ sqlite/doc/*.html \ sqlite/src/*.h \ sqlite/src/*.c \ @@ -144,3 +163,4 @@ publish: $(PUBLISH) clean: rm -f *.o sqlite libsqlite.a sqlite.h rm -f lemon lempar.c parse.* sqlite.tar.gz + rm -f $(PUBLISH) diff --git a/README b/README new file mode 100644 index 0000000000..129674e1e7 --- /dev/null +++ b/README @@ -0,0 +1,36 @@ +This directory contains source code to + + SQLite: An SQL Frontend To GDBM + +To compile the project, first create a directory in which to place +the build products. The build directory must be separate from the +source tree. Cd into the build directory and then from the build +directory run the configure script found at the root of the source +tree. Then run "make". + +For example: + + tar xzf sqlite.tar.gz ;# Unpack the source tree into "sqlite" + mkdir bld ;# Build will occur in a sibling directory + cd bld ;# Change to the build directory + ../sqlite/configure ;# Run the configure script + make ;# Run the makefile. + +The primary build products are left in the build directory. The +primary build products are: + + libsqlite.a The SQLite library file + + sqlite.h A header file for SQLite + + sqlite Command line program for accessing SQLite databases + +There are some other make targets of interest: + + + make regression This runs a regression test on the library. + + make gdbmdump This builds a utility named "gdbmdump" that + writes out the contents of a GDBM file in a + readable format. It is useful for testing and + debugging the library. diff --git a/configure b/configure index dbf4986751..a9f05bc837 100755 --- a/configure +++ b/configure @@ -525,7 +525,7 @@ fi # The following RCS revision string applies to configure.in -# $Revision: 1.1 $ +# $Revision: 1.2 $ ######### # Make sure we are not building in a subdirectory of the source tree. @@ -540,6 +540,8 @@ if test "$temp" = ""; then ** the configure script or any subdirectory of that directory. Rerun ** ** the configure script from a directory that is separate from the ** ** source tree. ** +** ** +** See the README file for additional information. ** **************************************************************************" 1>&2; exit 1; } fi @@ -598,7 +600,7 @@ if test "$config_BUILD_CC" = ""; then # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:602: checking for $ac_word" >&5 +echo "configure:604: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -628,7 +630,7 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:632: checking for $ac_word" >&5 +echo "configure:634: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -679,7 +681,7 @@ fi # Extract the first word of "cl", so it can be a program name with args. set dummy cl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:683: checking for $ac_word" >&5 +echo "configure:685: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -711,7 +713,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:715: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:717: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -722,12 +724,12 @@ cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext << EOF -#line 726 "configure" +#line 728 "configure" #include "confdefs.h" main(){return(0);} EOF -if { (eval echo configure:731: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:733: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -753,12 +755,12 @@ if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:757: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:759: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:762: checking whether we are using GNU C" >&5 +echo "configure:764: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -767,7 +769,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:771: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:773: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -786,7 +788,7 @@ ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:790: checking whether ${CC-cc} accepts -g" >&5 +echo "configure:792: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -825,12 +827,12 @@ fi else BUILD_CC=$config_BUILD_CC echo $ac_n "checking host compiler""... $ac_c" 1>&6 -echo "configure:829: checking host compiler" >&5 +echo "configure:831: checking host compiler" >&5 CC=$BUILD_CC echo "$ac_t""$BUILD_CC" 1>&6 fi echo $ac_n "checking switches for the host compiler""... $ac_c" 1>&6 -echo "configure:834: checking switches for the host compiler" >&5 +echo "configure:836: checking switches for the host compiler" >&5 if test "$config_BUILD_CFLAGS" != ""; then CFLAGS=$config_BUILD_CFLAGS BUILD_CFLAGS=$config_BUILD_CFLAGS @@ -850,7 +852,7 @@ fi # the target machine. # echo $ac_n "checking target compiler""... $ac_c" 1>&6 -echo "configure:854: checking target compiler" >&5 +echo "configure:856: checking target compiler" >&5 if test "$config_TARGET_CC" != ""; then TARGET_CC=$config_TARGET_CC else @@ -858,7 +860,7 @@ else fi echo "$ac_t""$TARGET_CC" 1>&6 echo $ac_n "checking switches on the target compiler""... $ac_c" 1>&6 -echo "configure:862: checking switches on the target compiler" >&5 +echo "configure:864: checking switches on the target compiler" >&5 if test "$config_TARGET_CFLAGS" != ""; then TARGET_CFLAGS=$config_TARGET_CFLAGS else @@ -866,7 +868,7 @@ else fi echo "$ac_t""$TARGET_CFLAGS" 1>&6 echo $ac_n "checking target linker""... $ac_c" 1>&6 -echo "configure:870: checking target linker" >&5 +echo "configure:872: checking target linker" >&5 if test "$config_TARGET_LINK" = ""; then TARGET_LINK=$TARGET_CC else @@ -874,7 +876,7 @@ else fi echo "$ac_t""$TARGET_LINK" 1>&6 echo $ac_n "checking switches on the target compiler""... $ac_c" 1>&6 -echo "configure:878: checking switches on the target compiler" >&5 +echo "configure:880: checking switches on the target compiler" >&5 if test "$config_TARGET_TFLAGS" != ""; then TARGET_TFLAGS=$config_TARGET_TFLAGS else @@ -886,7 +888,7 @@ else # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:890: checking for $ac_word" >&5 +echo "configure:892: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -932,7 +934,7 @@ echo "$ac_t""$TARGET_TFLAGS" 1>&6 # it 0 if we are not. # echo $ac_n "checking if host and target compilers are the same""... $ac_c" 1>&6 -echo "configure:936: checking if host and target compilers are the same" >&5 +echo "configure:938: checking if host and target compilers are the same" >&5 if test "$BUILD_CC" = "$TARGET_CC"; then cross=0 echo "$ac_t""yes" 1>&6 @@ -947,7 +949,7 @@ fi # things accordingly. # echo $ac_n "checking if executables have the .exe suffix""... $ac_c" 1>&6 -echo "configure:951: checking if executables have the .exe suffix" >&5 +echo "configure:953: checking if executables have the .exe suffix" >&5 if test "$config_BUILD_EXEEXT" = ".exe"; then CYGWIN=yes echo "$ac_t""yes" 1>&6 @@ -956,12 +958,12 @@ else fi if test "$CYGWIN" != "yes"; then echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 -echo "configure:960: checking for Cygwin environment" >&5 +echo "configure:962: checking for Cygwin environment" >&5 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:978: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_cygwin=yes else @@ -1036,12 +1038,12 @@ else fi CC=$TARGET_CC echo $ac_n "checking for sin""... $ac_c" 1>&6 -echo "configure:1040: checking for sin" >&5 +echo "configure:1042: checking for sin" >&5 if eval "test \"`echo '$''{'ac_cv_func_sin'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1070: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_func_sin=yes" else @@ -1085,7 +1087,7 @@ LIBS="-lm" fi echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 -echo "configure:1089: checking for dlopen in -ldl" >&5 +echo "configure:1091: checking for dlopen in -ldl" >&5 ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1093,7 +1095,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1110: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1138,14 +1140,14 @@ fi LIBS="" echo $ac_n "checking for library containing Tcl_Init""... $ac_c" 1>&6 -echo "configure:1142: checking for library containing Tcl_Init" >&5 +echo "configure:1144: checking for library containing Tcl_Init" >&5 if eval "test \"`echo '$''{'ac_cv_search_Tcl_Init'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_func_search_save_LIBS="$LIBS" ac_cv_search_Tcl_Init="no" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1162: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_search_Tcl_Init="none required" else @@ -1167,7 +1169,7 @@ rm -f conftest* test "$ac_cv_search_Tcl_Init" = "no" && for i in tcl8.4 tcl8.3 tcl8.2 tcl8.1 tcl8.0 tcl80 tcl; do LIBS="-l$i $otherlibs $ac_func_search_save_LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1184: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_search_Tcl_Init="-l$i" break @@ -1207,7 +1209,7 @@ fi # Figure out where to get the TCL header files. # echo $ac_n "checking TCL header files""... $ac_c" 1>&6 -echo "configure:1211: checking TCL header files" >&5 +echo "configure:1213: checking TCL header files" >&5 found=no if test "$config_TARGET_TCL_INC" != ""; then TARGET_TCL_INC=$config_TARGET_TCL_INC @@ -1226,7 +1228,7 @@ if test "$found" = "yes"; then else echo "$ac_t""not specified: still searching..." 1>&6 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:1230: checking how to run the C preprocessor" >&5 +echo "configure:1232: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -1241,13 +1243,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1251: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1253: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -1258,13 +1260,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1268: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1270: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -1275,13 +1277,13 @@ else rm -rf conftest* CPP="${CC-cc} -nologo -E" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1285: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1287: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -1307,17 +1309,17 @@ echo "$ac_t""$CPP" 1>&6 ac_safe=`echo "tcl.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for tcl.h""... $ac_c" 1>&6 -echo "configure:1311: checking for tcl.h" >&5 +echo "configure:1313: checking for tcl.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1321: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1323: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -1344,7 +1346,7 @@ if test "$found" = "no"; then ac_safe=`echo "$dir/include/tcl.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $dir/include/tcl.h""... $ac_c" 1>&6 -echo "configure:1348: checking for $dir/include/tcl.h" >&5 +echo "configure:1350: checking for $dir/include/tcl.h" >&5 if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1385,14 +1387,14 @@ else LIBS="" echo $ac_n "checking for library containing gdbm_open""... $ac_c" 1>&6 -echo "configure:1389: checking for library containing gdbm_open" >&5 +echo "configure:1391: checking for library containing gdbm_open" >&5 if eval "test \"`echo '$''{'ac_cv_search_gdbm_open'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_func_search_save_LIBS="$LIBS" ac_cv_search_gdbm_open="no" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1409: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_search_gdbm_open="none required" else @@ -1414,7 +1416,7 @@ rm -f conftest* test "$ac_cv_search_gdbm_open" = "no" && for i in gdbm; do LIBS="-l$i $ac_func_search_save_LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1431: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_search_gdbm_open="-l$i" break @@ -1453,7 +1455,7 @@ fi # Figure out where to get the GDBM header files. # echo $ac_n "checking GDBM header files""... $ac_c" 1>&6 -echo "configure:1457: checking GDBM header files" >&5 +echo "configure:1459: checking GDBM header files" >&5 found=no if test "$config_TARGET_GDBM_INC" != ""; then TARGET_GDBM_INC=$config_TARGET_GDBM_INC @@ -1465,17 +1467,17 @@ else echo "$ac_t""not specified: still searching..." 1>&6 ac_safe=`echo "gdbm.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for gdbm.h""... $ac_c" 1>&6 -echo "configure:1469: checking for gdbm.h" >&5 +echo "configure:1471: checking for gdbm.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1479: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1481: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -1502,7 +1504,7 @@ if test "$found" = "no"; then ac_safe=`echo "$dir/include/gdbm.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $dir/include/gdbm.h""... $ac_c" 1>&6 -echo "configure:1506: checking for $dir/include/gdbm.h" >&5 +echo "configure:1508: checking for $dir/include/gdbm.h" >&5 if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1543,14 +1545,14 @@ else LIBS="" echo $ac_n "checking for library containing readline""... $ac_c" 1>&6 -echo "configure:1547: checking for library containing readline" >&5 +echo "configure:1549: checking for library containing readline" >&5 if eval "test \"`echo '$''{'ac_cv_search_readline'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_func_search_save_LIBS="$LIBS" ac_cv_search_readline="no" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1567: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_search_readline="none required" else @@ -1572,7 +1574,7 @@ rm -f conftest* test "$ac_cv_search_readline" = "no" && for i in readline; do LIBS="-l$i $ac_func_search_save_LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1589: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_search_readline="-l$i" break @@ -1611,7 +1613,7 @@ fi # Figure out where to get the READLINE header files. # echo $ac_n "checking readline header files""... $ac_c" 1>&6 -echo "configure:1615: checking readline header files" >&5 +echo "configure:1617: checking readline header files" >&5 found=no if test "$config_TARGET_READLINE_INC" != ""; then TARGET_READLINE_INC=$config_TARGET_READLINE_INC @@ -1623,17 +1625,17 @@ else echo "$ac_t""not specified: still searching..." 1>&6 ac_safe=`echo "readline.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for readline.h""... $ac_c" 1>&6 -echo "configure:1627: checking for readline.h" >&5 +echo "configure:1629: checking for readline.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1637: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1639: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -1660,7 +1662,7 @@ if test "$found" = "no"; then ac_safe=`echo "$dir/include/readline.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $dir/include/readline.h""... $ac_c" 1>&6 -echo "configure:1664: checking for $dir/include/readline.h" >&5 +echo "configure:1666: checking for $dir/include/readline.h" >&5 if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1689,7 +1691,7 @@ fi ac_safe=`echo "$dir/include/readline/readline.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $dir/include/readline/readline.h""... $ac_c" 1>&6 -echo "configure:1693: checking for $dir/include/readline/readline.h" >&5 +echo "configure:1695: checking for $dir/include/readline/readline.h" >&5 if eval "test \"`echo '$''{'ac_cv_file_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else diff --git a/configure.in b/configure.in index a6f9a3147a..3106b43f77 100644 --- a/configure.in +++ b/configure.in @@ -151,7 +151,7 @@ AC_INIT(src/sqlite.h) dnl Put the RCS revision string after AC_INIT so that it will also dnl show in in configure. # The following RCS revision string applies to configure.in -# $Revision: 1.1 $ +# $Revision: 1.2 $ ######### # Make sure we are not building in a subdirectory of the source tree. @@ -166,6 +166,8 @@ if test "$temp" = ""; then ** the configure script or any subdirectory of that directory. Rerun ** ** the configure script from a directory that is separate from the ** ** source tree. ** +** ** +** See the README file for additional information. ** **************************************************************************]) fi diff --git a/manifest b/manifest index 300587508e..a19528f384 100644 --- a/manifest +++ b/manifest @@ -1,22 +1,27 @@ -C :-)\s(CVS\s5) -D 2000-05-29T18:50:16 -F Makefile.in cb1ba563614eae8c4f2261fe464ae4652179cb37 -F configure 8faba4d0194321e5f61a64e842c65eab0f68e6d8 x -F configure.in 4fc2947d631037bd340b112d6193847d7ac827ae +C :-)\s(CVS\s6) +D 2000-05-29T20:41:50 +F COPYRIGHT 74a8a6531a42e124df07ab5599aad63870fa0bd4 +F Makefile.in f5e807375d080405b757239762db8f3b4124e08a +F README 0200f7787a68917ac55c07b97e3c3a982bccd0bc +F configure 00a5b5c82147a576fa6e82d7c1b0d55c321d6d2c x +F configure.in 6ccfd5fc80517f7cfe605a7fc7e0f62d962a233c F doc/lemon.html e233a3e97a779c7a87e1bc4528c664a58e49dd47 F src/build.c 45dc91016e13dec70620b049a53ba785b4a0c76b F src/dbbe.c ab05293e89525041eaab8b4aca10516db3648792 F src/dbbe.h bedeb3a0985bb584458e7849fb59927e99e751e6 F src/main.c 25cce7bce0eb3ba10bada7c05f4b38dc6dbbc86f +F src/parse.y 265c8596598afba0a94b94acd9c866d01603dfe5 F src/shell.c 125f84ea5f8b725ba474d4702b575d062cc94d92 F src/sqlite.h 2397c17a8f4ca90c09acab0100dc7e2f8f441b69 F src/sqliteInt.h 0365970442441b5e9b74e1e828afdeac7b0662be -F src/tclsqlite.c 6eca1c1b8713048245d295ed18dca71c91d4931f +F src/tclsqlite.c 30f4317e1fc9119b130f29ee5dac4ab9121de68b F src/tokenize.c ab578d90ec6ab117b7ade6e6cfbcb5b0f9cad500 F src/util.c b2e2a4dc55f7cbd41a7d9e0a8473eedd3b2691c8 F src/vdbe.c 80132b6bb9a744d1990a1c16666d54baaff2dbc3 F src/vdbe.h e721ad308f2e6ca805cebc4dd0a196ce4419d030 F src/where.c 67ffea57920e16b33c580e9a9b9855b3ec9dea7b +F test/crttbl.test 49a73b927ad85bf8edae7e5311fde34bf5b2c1fb +F test/tester.tcl 31a9077926a5eb54dcae11b2c92abc1263dd675c F tool/gdbmdump.c 529e67c78d920606ba196326ea55b57b75fcc82b F tool/lemon.c cff35578b3c4d1491021b6418016639ebe21b1a5 F tool/lempar.c a1eec94d6eacc12332368660ec65f3b248853833 @@ -26,7 +31,7 @@ F tool/renumberOps.awk 6d067177ad5f8d711b79577b462da9b3634bd0a9 F www/c_interface.tcl f875864edf7974157d1c257ca08de854660882a5 F www/index.tcl 67b2bee04077377eacede2b11e21fe37ef7e10c6 F www/sqlite.tcl 947e067bcc347dc767af4c1a6e5a8d47d8404aa3 -P 1d3286702cf267857190e6082db15ba4132453d7 -R df24759e4161832879dbb325c08161a8 +P 9fd0628af897c54c122fdef02f79788385ece39c +R b39dfec9006cd0b187aa3d6ee1e9799f U drh -Z 3893ca4bcccca2377dab7ed9ed04dee7 +Z ad70bffed13ea99cad14d2118369d246 diff --git a/manifest.uuid b/manifest.uuid index e6ad0c1fa6..e2c8ab7a08 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9fd0628af897c54c122fdef02f79788385ece39c \ No newline at end of file +1517f85243b63511c2ceb73a10453c5ae56d3428 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y new file mode 100644 index 0000000000..65ee042444 --- /dev/null +++ b/src/parse.y @@ -0,0 +1,303 @@ +/* +** Copyright (c) 1999, 2000 D. Richard Hipp +** +** This program is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public +** License as published by the Free Software Foundation; either +** version 2 of the License, or (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** You should have received a copy of the GNU General Public +** License along with this library; if not, write to the +** Free Software Foundation, Inc., 59 Temple Place - Suite 330, +** Boston, MA 02111-1307, USA. +** +** Author contact information: +** drh@hwaci.com +** http://www.hwaci.com/drh/ +** +************************************************************************* +** This file contains SQLite's grammar for SQL. Process this file +** using the lemon parser generator to generate C code that runs +** the parser. Lemon will also generate a header file containing +** numeric codes for all of the tokens. +** +** @(#) $Id: parse.y,v 1.1 2000/05/29 20:42:06 drh Exp $ +*/ +%token_prefix TK_ +%token_type {Token} +%extra_argument {Parse *pParse} +%syntax_error { + sqliteSetNString(&pParse->zErrMsg,"syntax error near \"",0,TOKEN.z,TOKEN.n, + "\"", 1, 0); + pParse->sErrToken = TOKEN; +} +%name sqliteParser +%include { +#include "sqliteInt.h" +#include "parse.h" +} + + +// Input is zero or more commands. +input ::= cmdlist. + +// These are extra tokens used by the lexer but never seen by the +// parser. We put them in a rule so that the parser generator will +// add them to the sqliteTokens.h output file. +// +input ::= END_OF_FILE ILLEGAL SPACE UNCLOSED_STRING COMMENT FUNCTION + UMINUS FIELD. + +// A list of commands is zero or more commands +// +cmdlist ::= ecmd. +cmdlist ::= cmdlist SEMI ecmd. +ecmd ::= explain cmd. {sqliteExec(pParse);} +ecmd ::= cmd. {sqliteExec(pParse);} +ecmd ::= . +explain ::= EXPLAIN. {pParse->explain = 1;} + +// The first form of a command is a CREATE TABLE statement. +// +cmd ::= create_table create_table_args. +create_table ::= CREATE(X) TABLE ID(Y). {sqliteStartTable(pParse,&X,&Y);} +create_table_args ::= LP columnlist conslist_opt RP(X). + {sqliteEndTable(pParse,&X);} +columnlist ::= columnlist COMMA column. +columnlist ::= column. + +// About the only information used for a column is the name of the +// column. The type is always just "text". But the code will accept +// an elaborate typename. Perhaps someday we'll do something with it. +// +column ::= columnid type carglist. +columnid ::= ID(X). {sqliteAddColumn(pParse,&X);} +type ::= typename. +type ::= typename LP signed RP. +type ::= typename LP signed COMMA signed RP. +typename ::= ID. +typename ::= typename ID. +signed ::= INTEGER. +signed ::= PLUS INTEGER. +signed ::= MINUS INTEGER. +carglist ::= carglist carg. +carglist ::= . +carg ::= CONSTRAINT ID ccons. +carg ::= ccons. +carg ::= DEFAULT expr. + +// In addition to the type name, we also care about the primary key. +// +ccons ::= NOT NULL. +ccons ::= PRIMARY KEY sortorder. + {sqliteCreateIndex(pParse,0,0,0,0,0);} +ccons ::= UNIQUE. +ccons ::= CHECK expr. + +// For the time being, the only constraint we care about is the primary +// key. +// +conslist_opt ::= . +conslist_opt ::= COMMA conslist. +conslist ::= conslist COMMA tcons. +conslist ::= tcons. +tcons ::= CONSTRAINT ID tcons2. +tcons ::= tcons2. +tcons2 ::= PRIMARY KEY LP idxlist(X) RP. + {sqliteCreateIndex(pParse,0,0,X,0,0);} +tcons2 ::= UNIQUE LP idlist RP. +tcons2 ::= CHECK expr. +idlist ::= idlist COMMA ID. +idlist ::= ID. + +// The next command format is dropping tables. +// +cmd ::= DROP TABLE ID(X). {sqliteDropTable(pParse,&X);} + +// The select statement +// +cmd ::= select. +select ::= SELECT selcollist(W) from(X) where_opt(Y) orderby_opt(Z). + {sqliteSelect(pParse, W, X, Y, Z);} +select ::= SELECT STAR from(X) where_opt(Y) orderby_opt(Z). + {sqliteSelect(pParse, 0, X, Y, Z);} + +%type selcollist {ExprList*} +%destructor selcollist {sqliteExprListDelete($$);} +%type sclp {ExprList*} +%destructor sclp {sqliteExprListDelete($$);} + +sclp(A) ::= selcollist(X) COMMA. {A = X;} +sclp(A) ::= . {A = 0;} +selcollist(A) ::= sclp(P) expr(X). {A = sqliteExprListAppend(P,X,0);} +selcollist(A) ::= sclp(P) expr(X) AS ID(Y). {A = sqliteExprListAppend(P,X,&Y);} +selcollist(A) ::= sclp(P) expr(X) AS STRING(Y). + {A = sqliteExprListAppend(P,X,&Y);} + +%type seltablist {IdList*} +%destructor seltablist {sqliteIdListDelete($$);} +%type stl_prefix {IdList*} +%destructor stl_prefix {sqliteIdListDelete($$);} +%type from {IdList*} +%destructor from {sqliteIdListDelete($$);} + +from(A) ::= FROM seltablist(X). {A = X;} +stl_prefix(A) ::= seltablist(X) COMMA. {A = X;} +stl_prefix(A) ::= . {A = 0;} +seltablist(A) ::= stl_prefix(X) ID(Y). {A = sqliteIdListAppend(X,&Y);} +seltablist(A) ::= stl_prefix(X) ID(Y) AS ID(Z). + {A = sqliteIdListAppend(X,&Y); + sqliteIdListAddAlias(A,&Z);} + +%type orderby_opt {ExprList*} +%destructor orderby_opt {sqliteExprListDelete($$);} +%type sortlist {ExprList*} +%destructor sortlist {sqliteExprListDelete($$);} +%type sortitem {Expr*} +%destructor sortitem {sqliteExprDelete($$);} + +orderby_opt(A) ::= . {A = 0;} +orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} +sortlist(A) ::= sortlist(X) COMMA sortitem(Y) sortorder(Z). + { + A = sqliteExprListAppend(X,Y,0); + A->a[A->nExpr-1].idx = Z; + } +sortlist(A) ::= sortitem(Y) sortorder(Z). + { + A = sqliteExprListAppend(0,Y,0); + A->a[0].idx = Z; + } +sortitem(A) ::= ID(X). {A = sqliteExpr(TK_ID, 0, 0, &X);} +sortitem(A) ::= ID(X) DOT ID(Y). + { + Expr *temp1 = sqliteExpr(TK_ID, 0, 0, &X); + Expr *temp2 = sqliteExpr(TK_ID, 0, 0, &Y); + A = sqliteExpr(TK_DOT, temp1, temp2, 0); + } + +%type sortorder {int} + +sortorder(A) ::= ASC. {A = 0;} +sortorder(A) ::= DESC. {A = 1;} +sortorder(A) ::= . {A = 0;} + +cmd ::= DELETE FROM ID(X) where_opt(Y). + {sqliteDeleteFrom(pParse, &X, Y);} + +%type where_opt {Expr*} +%destructor where_opt {sqliteExprDelete($$);} + +where_opt(A) ::= . {A = 0;} +where_opt(A) ::= WHERE expr(X). {A = X;} + +%type setlist {ExprList*} +%destructor setlist {sqliteExprListDelete($$);} + +cmd ::= UPDATE ID(X) SET setlist(Y) where_opt(Z). + {sqliteUpdate(pParse,&X,Y,Z);} + +setlist(A) ::= ID(X) EQ expr(Y) COMMA setlist(Z). + {A = sqliteExprListAppend(Z,Y,&X);} +setlist(A) ::= ID(X) EQ expr(Y). {A = sqliteExprListAppend(0,Y,&X);} + +cmd ::= INSERT INTO ID(X) fieldlist_opt(F) VALUES LP itemlist(Y) RP. + {sqliteInsert(pParse, &X, Y, F);} + + +%type itemlist {ExprList*} +%destructor itemlist {sqliteExprListDelete($$);} +%type item {Expr*} +%destructor item {sqliteExprDelete($$);} + +itemlist(A) ::= itemlist(X) COMMA item(Y). {A = sqliteExprListAppend(X,Y,0);} +itemlist(A) ::= item(X). {A = sqliteExprListAppend(0,X,0);} +item(A) ::= INTEGER(X). {A = sqliteExpr(TK_INTEGER, 0, 0, &X);} +item(A) ::= FLOAT(X). {A = sqliteExpr(TK_FLOAT, 0, 0, &X);} +item(A) ::= STRING(X). {A = sqliteExpr(TK_STRING, 0, 0, &X);} + +%type fieldlist_opt {IdList*} +%destructor fieldlist_opt {sqliteIdListDelete($$);} +%type fieldlist {IdList*} +%destructor fieldlist {sqliteIdListDelete($$);} + +fieldlist_opt(A) ::= . {A = 0;} +fieldlist_opt(A) ::= LP fieldlist(X) RP. {A = X;} +fieldlist(A) ::= fieldlist(X) COMMA ID(Y). {A = sqliteIdListAppend(X,&Y);} +fieldlist(A) ::= ID(Y). {A = sqliteIdListAppend(0,&Y);} + +%left OR. +%left AND. +%left EQ NE ISNULL NOTNULL IS. +%left GT GE LT LE. +%left PLUS MINUS. +%left STAR SLASH PERCENT. +%right NOT. + +%type expr {Expr*} +%destructor expr {sqliteExprDelete($$);} + +expr(A) ::= LP expr(X) RP. {A = X;} +expr(A) ::= ID(X). {A = sqliteExpr(TK_ID, 0, 0, &X);} +expr(A) ::= NULL. {A = sqliteExpr(TK_NULL, 0, 0, 0);} +expr(A) ::= ID(X) DOT ID(Y). {Expr *temp1 = sqliteExpr(TK_ID, 0, 0, &X); + Expr *temp2 = sqliteExpr(TK_ID, 0, 0, &Y); + A = sqliteExpr(TK_DOT, temp1, temp2, 0);} +expr(A) ::= INTEGER(X). {A = sqliteExpr(TK_INTEGER, 0, 0, &X);} +expr(A) ::= FLOAT(X). {A = sqliteExpr(TK_FLOAT, 0, 0, &X);} +expr(A) ::= STRING(X). {A = sqliteExpr(TK_STRING, 0, 0, &X);} +// expr(A) ::= ID(X) LP exprlist(Y) RP. {A = sqliteExprFunction(Y, &X);} +// expr(A) ::= ID(X) LP STAR RP. {A = sqliteExprFunction(0, &X);} +expr(A) ::= expr(X) AND expr(Y). {A = sqliteExpr(TK_AND, X, Y, 0);} +expr(A) ::= expr(X) OR expr(Y). {A = sqliteExpr(TK_OR, X, Y, 0);} +expr(A) ::= expr(X) LT expr(Y). {A = sqliteExpr(TK_LT, X, Y, 0);} +expr(A) ::= expr(X) GT expr(Y). {A = sqliteExpr(TK_GT, X, Y, 0);} +expr(A) ::= expr(X) LE expr(Y). {A = sqliteExpr(TK_LE, X, Y, 0);} +expr(A) ::= expr(X) GE expr(Y). {A = sqliteExpr(TK_GE, X, Y, 0);} +expr(A) ::= expr(X) NE expr(Y). {A = sqliteExpr(TK_NE, X, Y, 0);} +expr(A) ::= expr(X) EQ expr(Y). {A = sqliteExpr(TK_EQ, X, Y, 0);} +expr(A) ::= expr(X) IS expr(Y). {A = sqliteExpr(TK_EQ, X, Y, 0);} +expr(A) ::= expr(X) PLUS expr(Y). {A = sqliteExpr(TK_PLUS, X, Y, 0);} +expr(A) ::= expr(X) MINUS expr(Y). {A = sqliteExpr(TK_MINUS, X, Y, 0);} +expr(A) ::= expr(X) STAR expr(Y). {A = sqliteExpr(TK_STAR, X, Y, 0);} +expr(A) ::= expr(X) SLASH expr(Y). {A = sqliteExpr(TK_SLASH, X, Y, 0);} +expr(A) ::= expr(X) ISNULL. {A = sqliteExpr(TK_ISNULL, X, 0, 0);} +expr(A) ::= expr(X) NOTNULL. {A = sqliteExpr(TK_NOTNULL, X, 0, 0);} +expr(A) ::= NOT expr(X). {A = sqliteExpr(TK_NOT, X, 0, 0);} +expr(A) ::= MINUS expr(X). [NOT] {A = sqliteExpr(TK_UMINUS, X, 0, 0);} +expr(A) ::= PLUS expr(X). [NOT] {A = X;} + +%type exprlist {ExprList*} +%destructor exprlist {sqliteExprListDelete($$);} +%type expritem {Expr*} +%destructor expritem {sqliteExprDelete($$);} + +/* +exprlist(A) ::= exprlist(X) COMMA expritem(Y). + {A = sqliteExprListAppend(X,Y,0);} +exprlist(A) ::= expritem(X). {A = sqliteExprListAppend(0,X,0);} +expritem(A) ::= expr(X). {A = X;} +expritem(A) ::= . {A = 0;} +*/ + +cmd ::= CREATE(S) uniqueflag INDEX ID(X) ON ID(Y) LP idxlist(Z) RP(E). + {sqliteCreateIndex(pParse, &X, &Y, Z, &S, &E);} +uniqueflag ::= UNIQUE. +uniqueflag ::= . + +%type idxlist {IdList*} +%destructor idxlist {sqliteIdListDelete($$);} +%type idxitem {Token} + +idxlist(A) ::= idxlist(X) COMMA idxitem(Y). + {A = sqliteIdListAppend(X,&Y);} +idxlist(A) ::= idxitem(Y). + {A = sqliteIdListAppend(0,&Y);} +idxitem(A) ::= ID(X). {A = X;} + +cmd ::= DROP INDEX ID(X). {sqliteDropIndex(pParse, &X);} diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 55e9a85570..2d4d154ebc 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -23,7 +23,7 @@ ************************************************************************* ** A TCL Interface to SQLite ** -** $Id: tclsqlite.c,v 1.1 2000/05/29 14:26:01 drh Exp $ +** $Id: tclsqlite.c,v 1.2 2000/05/29 20:41:51 drh Exp $ */ #include "sqlite.h" #include @@ -239,3 +239,57 @@ int Sqlite_SafeInit(Tcl_Interp *interp){ int Et_AppInit(Tcl_Interp *interp){ return Sqlite_Init(interp); } + +/* +** If the macro TCLSH is defined and is one, then put in code for the +** "main" routine that will initialize Tcl. +*/ +#if defined(TCLSH) && TCLSH==1 +static char zMainloop[] = + "set line {}\n" + "while {![eof stdin]} {\n" + "if {$line!=\"\"} {\n" + "puts -nonewline \"> \"\n" + "} else {\n" + "puts -nonewline \"% \"\n" + "}\n" + "flush stdout\n" + "append line [gets stdin]\n" + "if {[info complete $line]} {\n" + "if {[catch {uplevel #0 $line} result]} {\n" + "puts stderr \"Error: $result\"\n" + "} elseif {$result!=\"\"} {\n" + "puts $result\n" + "}\n" + "set line {}\n" + "} else {\n" + "append line \\n\n" + "}\n" + "}\n" +; + +#define TCLSH_MAIN main /* Needed to fake out mktclapp */ +int TCLSH_MAIN(int argc, char **argv){ + Tcl_Interp *interp; + interp = Tcl_CreateInterp(); + Sqlite_Init(interp); + if( argc>=2 ){ + int i; + Tcl_SetVar(interp,"argv0",argv[1],TCL_GLOBAL_ONLY); + Tcl_SetVar(interp,"argv", "", TCL_GLOBAL_ONLY); + for(i=2; i