Selaajan toiminta
=================

Selaaja luo tekstialkioita saamastaan tavuvirrasta, jotka se toimittaa
jäsentäjälle.

Tekstialkiot erotellaan tyhjillä merkeillä ja kommenteilla, joita saa
olla kahden alkion välissä kuinka paljon tahansa sekä toisilla 
tekstialkioilla.

Selaaja pyrkii aina pisimpään mahdolliseen tekstialkioon. Täten esim.
"abc123":stä tulee vain yksi alkio: <IDENTIFIER>. Sen sijaan "abc 123"
synnyttää kaksi eri alkiota: <IDENTIFIER> ja <UNSIGNEDINT>.
Ja edelleen "abc*123" synnyttää kolme eri alkiota: <IDENTIFIER>
<ASTERISK> ja <UNSIGNEDINT>.  Kts. kohta Tunnisteet.

Toisaalta "abc-123":sta tulee <IDENTIFIER> <SIGNEDINT>, koska
<SIGNEDINT> on määritelty ennen viiva-merkkiä <DASH> ja se voi myös
alkaa viivalla. Eli esiintymisjärjestyksellä on myös väliä.


Tyhjämerkit (whitespace)
------------------------
välilyönti
tabulaattori
rivinvaihdot: NL, CR, CR+NL


Kommentit
---------
REM  Rivikommentti, jossa REM-sanan oltava rivin alussa

     (Oraclessa REM missä kohtaa tahansa rivillä, poistaa koko rivin,
      mutta esim. CREATE TABLE -lauseen keskellä ei saa olla
      REM-kommenttia.)

--  Rivikommentti mistä sarakkeesta tahansa rivin loppuun

/* Monirivinen kommentti.
   /* Sisäkkäisten kommenttien on oltava myös ehjiä */
   muuten kommentin loppu voi jäädä huomaamatta
   Kommenttien sisällä saa olla mitä merkkejä tahansa.
*/


Tunnetut merkit
---------------
SQL-92:sta: " ' % & ( ) *  + , - . / : ; < = > ? _ |
Oraclesta lisäksi: # $

Muista merkeistä syntyy virheilmoitus ja selaaminen keskeytyy.
(Haluttaessa merkkejä voidaan lisätä tiedostoon SQLParser.jjt:hen)

Varatut sanat
-------------
kts. tiedostosta SQLParser.jjt kohdista /* Varatut sanat */ ja
/* Tietotyypit */


Tunnisteet ja literaalit
------------------------

UNSIGNEDINT:  yksi tai useampi numeromerkki peräkkäin

SIGNEDINT:    (+|-) <UNSIGNEDINT>

IDENTIFIER:   alkaa kirjaimella (A-Z, a-z), jonka jälkeen seuraavia
               merkkejä: _ # $ kirjain numero

QUOTEDSTRING: lainausmerkkien välistä otettu merkkijono, jossa 
              lainausmerkkipari muutettu yhdeksi lainausmerkiksi.

BITSTRINGLITERAL:           b'00101101'

HEXSTRINGLITERAL:           x'3f4da0'

NATIONALCHARSTRINGLITERAL:  n'qwer1234'

CHARSTRINGLITERAL:          'qwer1234'



*****************************************************************************



Jäsentäjän toiminta
===================


Hyväksytyt lauseet
-----------------
SQL-lauseen kaksi ensimmäistä sanaa riittävät erottelemaan tunnistettavat
lauseet. Muut lauseet ohitetaan ilman tarkistuksia selaamalla lauseen
loppuun etsien lauseen päättävä puolipiste tai kauttaviiva.


Tunnistetut tietotyypit
-----------------------
Tietotyypit yhdistetty yhdeksi pötköksi, jolloin jäsentäjä tunnistaa vähän
ylimääräisiäkin yhdistelmiä. INTERVAL-tyyppi on erikseen.

[xx]   - tarkoittaa, että xx on valinnainen.
a | b  - tarkoittaa vaihtoehtoa: joko a tai b
merkinnät sanojen perässä kertovat mistä tietotyyppi on peräisin:
  ei mitään = SQL-92
          1 = Oracle7
          2 = Oracle7:ssä tukena muille järjestelmille
          3 = joku muu (esmes. DB2)


[ NATIONAL ]
               BIT
               CHARACTER
               CHAR
               NCHAR
               DATE
               DEC
               DECIMAL
               DOUBLE PRECISION
               FLOAT
               GRAPHIC                    /* 3 */
               INT
               INTEGER
               LONG                       /* 1 */
               MLSLABEL                   /* 1 */
               NUMERIC
               NUMBER                     /* 1 */
               RAW                        /* 1 */
               LONG RAW                   /* 1 */
               REAL
               ROWID                      /* 1 */
               SMALLINT
               TIME
               TIME WITH TIME ZONE
               TIMESTAMP
               VARCHAR
               LONG VARCHAR               /* 2 */
               VARCHAR2                   /* 1 */
               VARGRAPHIC                 /* 3 */
               LONG VARGRAPHIC            /* 3 */

[ VARYING ]  [(int [, [+|-]int])]
[ CHARACTER SET <nimi> ]  // tätä ei tallenneta

ja

INTERVAL-tyyppi:
      INTERVAL
ja joko
      NonSecondDatetimeField  [ "(" <UNSIGNEDINT> ")" ]    (1)
      TO
      (
          NonSecondDatetimeField
      |
          SECOND [ "(" <UNSIGNEDINT> ")" ]                 (2)
      )
tai
      (1)
tai
      (2)
missä
  NonSecondDatetimeField = ( YEAR | MONTH | DAY | HOUR | MINUTE )


Tunnisteet
----------
_<charset>  <tunniste>

tunnisteen edessä voi SQL-92:n mukaan määritellä siinä käytettävän
merkistön nimen alaviivalla varustettuna. Oraclessa tätä ei tueta.
Ei tallenneta.

<tunniste> on joko yksi selaajan antama <IDENTIFIER> -alkio tai
mahdollisesti useampi <QUOTEDSTRING> -alkio esim. "tavu" "-" "viiva",
jotka jäsentäjä yhdistää merkkijonoksi "tavu-viiva" standardin mukaan.


Hyväksytyt nimet
----------------
Sarakenimi on mikä tahansa hyväksytty tunniste.

Standardin mukaan osa nimistä mm. taulun nimi ja arvojoukon nimi,
voivat koostua kolmesta pisteellä erotetusta osasta.
Näinollen seuraavat nimet ovat mahdollisia:

    taulunimi
    schema.taulunimi
    catalog.schema.taulunimi

taulunimeksi hyväksytään mikä tahansa tunniste.
scheman ja catalogin (standardin nimityksiä) vastattava <IDENTIFIER>
tyyppiä.

Edelleen standardin mukaan pisteiden ja sanojen välissä ei saa olla
tyhjää. Tästä säännöstä poiketaan, koska muutoin kieliopin laadinta
hankaloituisi suuresti.

Näistä nimistä jäsentäjä unohtaa alkuosan ja välittää vain taulunimen
eteenpäin.


Oletusarvo
----------
Oletusarvomäärittelyssa DEFAULT-sanan jälkeen on oltava jokin
seuraavavista:

    kokonaislukuvakio           esim. -32768
    merkkijonovakio             esim. 'heittomerkit oltava'

    bittivakio                  esim. b'00101101'
    hexalukuvakio               esim. x'3f4da0'
    "national" merkkijonovakio  esim. n'qwer1234'

    NULL, USER, CURRENT_USER, SESSION_USER, SYSTEM_USER

    CURRENT_DATE, CURRENT_TIME ["(" <UNSIGNEDINT> ")"],
    CURRENT_TIMESTAMP ["(" <UNSIGNEDINT> ")"]

Käytännössä jäsentäjä hyväksyy arvoksi myös minkä tahansa <IDENTIFIER>
-alkion sisällön.


Jäsennyspuu
===========
Kieliopin produktioiden yhteyteen on lisätty jäsennyspuun luontiin
liittyviä määrittelyitä, jotka käännetään JJTree-esikääntäjällä
jäsennyspuunluontikoodiksi.

"#nimi"-tyyliset määrittelyt kertovat minkä niminen solmu luodaan
kyseisessä kohdassa. Solmun vaikutusalue on sitä edeltävä määrittely.

Esim.

   void Abc() #OmaNode : {} { .. }

pitää koko metodin sisällään ja

   ( Term() | Factor() ) #OmaNode

sulkujen väliin jäävän osan.

jjtThis-muuttujalla viitataan solmuun jonka vaikutusalueella ollaan.

SQLString-solmu on erikoisuus. Se kerää kaikki tekstialkiot
vaikutusalueeltaan ja yhdistää ne välilyönneillä yhdeksi merkkijonoksi.

Lisää jäsennyspuusta JJTree-dokumenteista.