Linux, 1333 un Oracle 11.2

January 21st, 2012

Tabula:

CREATE TABLE testret(id VARCHAR2(4), data VARCHAR2(4000));

Un tad 4 INSERTi, kas atšķiras tikai ar varchar mainīgā izmēru, bet ne datu garumu.

EXEC SQL BEGIN DECLARE SECTION;
    varchar data1333[1333];
    varchar data1334[1334];

    varchar id1333[1333];
    varchar id1334[1334];
EXEC SQL END DECLARE SECTION;

memset(data1333.arr, 'X', 1);
data1333.len = 1;
memset(data1334.arr, 'X', 1);
data1334.len = 1;
id1333.len = 0;
id1334.len = 0;

EXEC SQL INSERT INTO testret (id, data) VALUES ('1', :data1333) RETURNING id INTO :id1333;
assert(SQLCODE == 0);
EXEC SQL INSERT INTO testret (id, data) VALUES ('2', :data1334) RETURNING id INTO :id1333;
assert(SQLCODE == 0);
EXEC SQL INSERT INTO testret (id, data) VALUES ('3', :data1333) RETURNING id INTO :id1334;
assert(SQLCODE == 0);
EXEC SQL INSERT INTO testret (id, data) VALUES ('4', :data1334) RETURNING id INTO :id1334;
assert(SQLCODE == 0);

Izpildot programmu pret Oracle 11.2 serveri UTF-8 kodējumā, kā jums liekas, kāds būs rezultāts šādam vaicājumam?

SELECT id, DECODE(data, NULL, 0, LENGTH(data)) data_length FROM testret;

Nepareizi! Pārsniedzot maģisko izmēru 1333, dati tiek pazaudēti:

ID   DATA_LENGTH
---- -----------
1	       1
2	       1
3	       1
4	       0

To pašu var uzrakstīt arī ar OCI, nevis PRO*C. Un binārais fails korekti strādā pret vecākām 10.x servera versijām.

Vispār, kopš redzēju kā Oracle 10.2 sajauca vietām kolonas, ja mainīgā izmērs pārsniedza kaut kādus 400x baitus, šajā gadījumā mani pārsteidz tikai maģiskais skaitlis 1333.

Dāvana vadītājai

December 1st, 2011

Ieraugot aprakstu “Melna ādas pletne ar gumijas rokturi spēcīgiem pārbaudījumiem“, sapratu, ka šī ir īstā:

Belašu kods

November 29th, 2011

Ja tu redzēsi kā tas tiek rakstīts, vairs nekad negribēsi lietot programmu.
Un tamlīdzīgi.

Dienas joks

November 25th, 2011

- Kā lai es… Kā lai es jums to vieglāk izskaidroju?
- Mēģiniet tā kā tas bija patiesībā, tad būtu skaidrāk.
(apmēram 15:20)

Poor man’s cloud computing

November 3rd, 2011

Serverim jāpiešķir vārds (hostname) “cloud”…

jmc R.I.P.

October 25th, 2011

Lisp nelaime.

Negribu būt ļauns, bet kurš nākošais?

dmr R.I.P.

October 13th, 2011

Khh, par Ābolīša nelaimi rakstīja katrs, kuram nav slinkums, par C un Unix nelaimi Latvija pagaidām klusē. Lai nu kas, bet programmēšana C un Unix-veidīgās operētājsistēmas tiešām ir ietekmējušas manu dzīvi.

His pointer has been cast to void *; his process has terminated with exit code 0.

Dark side

October 10th, 2011

Pirms kāda laika ar kolēģiem runājām, ka mani dēli ir “parasti bērni”: pretēji mītiem, pirms gulētiešanas es viņiem nelasu Python kodu un nemācu skaitīt binārajā sistēmā. Lai gan binārā skaitīšanas sistēmā iemācīt skaitīt līdz 10 būtu tik viegli.
Pēc Banku augstskolas izlaiduma par šo tēmu varētu parunāt vēl:

Oracle un NoSQL

October 5th, 2011

Oracle ir nopublicējuši savu nostāju par NoSQL. Protams, no RDBMS autora savādāku viedokli nevarēja gaidīt, bet tajā visā ir liela daļa patiesības vai vismaz viela pārdomām.

Izskatās, ka no paša Oracle serveriem šis dokuments ir pazudis.

Oracle LOB programmēšana

October 5th, 2011

Oracle API darbam ar LOB ir viens no nepārdomātākajiem API, ar ko nācies sastapties. Kā rezultātā naiva LOB pievienošana datu bāzei sastāv no 3 soļiem (un roundtrip):

  1. Pievieno tabulai rakstu ar tukšu LOB, piemēram, EMPTY_CLOB()
  2. Nolasa šo pašu lauku no tikko pievienotā ieraksta un iegūst LOB “lokatoru”
  3. Raksta datu porciju LOB-ā (“lokatorā”)

Par laimi, Oracle ir RETURNING INTO, kas ļauj apvienot 1. un 2. soli. Ja samierinās ar datu izmēra ierobežojumiem un šmaukšanos ar Oracle tipu konvertāciju (“data API”), tad to visu var izdarīt vienā solī.

Bet tas vēl ir ciešams, līdz LOB grib lietot Oracle rindās. Rindas būtībā ir viens abstrakcijas līmenis virs “parastajām” tabulām, tāpēc RETURNING INTO un “data API” izmantot nevar. Lai padarītu dzīvi interesantāku, “plikus” LOB, tāpat kā lielāko daļu pārējo datu tipu, rindās ielikt nevar. Ir jāveido objekts ar LOB atribūtu.

Oracle dokumentācija iesaka likt rindā tukšu objektu un iegūt ziņojuma identifikatoru rindā. Pēc tam jāpārkāpj pāri abstrakcijai (bvēēē) un rindai apakšā esošajā tabulā (papildus darbs noskaidrot nosaukumu) jāsameklē LOB “lokators” pēc ziņojuma identifikatora, utt. Tie paši 3 soļi, kas stāsta sākumā.

Un tā nepārdomāts LOB API ir izčakarējis rindu API, jo bija slinkums izdomāt kā izveidot LOB bez ieraksta pievienošanas tabulai.

Ruby REXML

September 6th, 2011

Oh, and if REXML sucks so bad, why does the Ruby team make sure that it ships with every Ruby distribution? What does it say about the language that they allow something so woefully broken to be a backbone of their language?

Apmēram pie šādas atziņas nonācu arī es, pētot kāpēc kādam skriptam ir tiek nereālas prasības pret atmiņas apjomu un izpildes laiku. 25Mb XML fails atmiņā aizņem 0.5Gb – WTF? Man liekas, ka ir īpaši jāpiepūlas izdarīt kaut ko greizi, lai iegūtu šādu proporciju.
Varēja, protams, meklēt labāku XML bibliotēku, bet es labāk problēmu atrisināju Python standarta ElementTree bibliotēku.

Gone fishing

August 10th, 2011

Bilde piemiņai, pirms kāds no tiem tiek atstāts zem ūdens:

UnQL

July 30th, 2011

Nu ko?

Kādas NoSQL datubāzes autori ir sajutuši nepieciešamību izveidot vaicājumu valodas standartu UnQL (Unstructured Data Query Language) , lai nebūtu jāsūta “go f*ck yourself” kā attēlā zemāk un vismaz teorētiski nodrošinātu neatkarību no konkrētās NoSQL datubāzes realizācijas. (SQL déjà vu?) Lielākais pārsteigums, gan ir par to, ka valoda ir balstīta uz SQL un, attiecīgi, relāciju algebru. Tātad datubāzei būs jākļūst gudrākai un jākrāj statistika, lai no deklaratīva apraksta spētu atrast optimālu izpildes ceļu. Lai krātu statistiku, kaut kas ir jāzin par datu struktūru. Un vēl vēlme nodrošināt vaicājumiem paredzamu rezultātu (“ensures predictable query results”). Man liekas, ka tas nozīmē atgriešanos pie apmēram tām pašām īpašībām, no kurām bēgot, radās NoSQL kustība.

Kas noved pie jautājuma: cik gadus mums jāgaida, līdz radīsies NoUnQL kustība?