Limites liées aux UDF JavaScript¶
Pour assurer la stabilitĂ© dans lâenvironnement Snowflake, Snowflake impose les limites suivantes aux UDFs JavaScript. Ces limitations ne sont pas appelĂ©es lors de la crĂ©ation dâUDF, mais plutĂŽt lors de lâexĂ©cution au moment de lâappel de lâUDF. Cette rubrique couvre les exigences gĂ©nĂ©rales et les dĂ©tails dâutilisation des UDF (fonctions dĂ©finies par lâutilisateur) JavaScript, ainsi que les limitations spĂ©cifiques aux UDFs JavaScript.
Dans ce chapitre :
Taille maximale du code source JavaScript¶
Snowflake limite la taille maximale du code source JavaScript dans le corps dâune UDF JavaScript. Snowflake recommande de limiter la taille Ă 100 KB. (Le code est stockĂ© sous une forme compressĂ©e et la limite exacte dĂ©pend de la capacitĂ© de compression du code).
La consommation dâune trop grande quantitĂ© de mĂ©moire entraĂźnera lâĂ©chec de lâUDF¶
Les UDFs JavaScript Ă©choueront si elles consomment trop de mĂ©moire. La limite spĂ©cifique est susceptible dâĂȘtre modifiĂ©e. Lâutilisation dâune trop grande quantitĂ© de mĂ©moire entraĂźnera le retour dâune erreur.
Un dĂ©lai dâexĂ©cution trop long entraĂźnera lâarrĂȘt de lâUDF et lâenvoi dâun message dâerreur¶
Les UDFs JavaScript qui prennent trop de temps Ă se terminer seront arrĂȘtĂ©es et une erreur sera retournĂ©e Ă lâutilisateur. De plus, les UDFs JavaScript qui commencent des boucles sans fin entraĂźneront des erreurs.
Une profondeur de pile excessive entraßne une erreur¶
Une profondeur de pile excessive due à la récursion entraßnera une erreur.
Ătat global¶
Snowflake prĂ©serve gĂ©nĂ©ralement lâĂ©tat global JavaScript entre les itĂ©rations dâune UDF. Cependant, vous ne devez pas vous fier aux modifications prĂ©cĂ©dentes de lâĂ©tat global disponibles entre les appels de fonctions. De plus, vous ne devez pas supposer que toutes les lignes sâexĂ©cuteront dans le mĂȘme environnement JavaScript.
Dans la pratique, lâĂ©tat global est pertinent dans les cas suivants :
Logique dâinitialisation complexe/coĂ»teuse. Par dĂ©faut, le code de lâUDF fourni est Ă©valuĂ© pour chaque ligne traitĂ©e. Si ce code contient une logique complexe, cela pourrait ĂȘtre inefficace.
Les fonctions qui contiennent du code qui nâest pas idempotent. Un modĂšle typique serait celui-ci :
Date.prototype._originalToString = Date.prototype.toString; Date.prototype.toString = function() { /* ... SOME CUSTOM CODE ... */ this._originalToString() }
La premiĂšre fois que ce code est exĂ©cutĂ©, il change lâĂ©tat de
toString
et_originalToString
. Ces changements sont conservĂ©s dans lâĂ©tat global, et la deuxiĂšme fois que ce code est exĂ©cutĂ©, les valeurs sont Ă nouveau modifiĂ©es de maniĂšre Ă crĂ©er une rĂ©cursion. La deuxiĂšme fois quetoString
est appelĂ©, le code se rĂ©pĂšte Ă lâinfini (jusquâĂ ce quâil nây ait plus dâespace de pile).
Pour ces situations, un modĂšle recommandĂ© est de garantir que le code pertinent nâest Ă©valuĂ© quâune seule fois, en utilisant la sĂ©mantique des variables globales de JavaScript. Par exemple :
var setup = function() { /* SETUP LOGIC */ }; if (typeof(setup_done) === "undefined") { setup(); setup_done = true; // setting global variable to true }
Notez que ce mĂ©canisme nâest sĂ»r que pour la mise en cache des effets de lâĂ©valuation du code. Il nâest pas garanti quâaprĂšs une initialisation, le contexte global sera prĂ©servĂ© pour toutes les lignes, et aucune logique mĂ©tier ne doit en dĂ©pendre.
BibliothÚques JavaScript¶
Les UDFs JavaScript acceptent lâaccĂšs Ă la bibliothĂšque JavaScript standard. Notez que ceci exclut de nombreux objets et de nombreuses mĂ©thodes gĂ©nĂ©ralement fournis par les navigateurs. Il nâexiste aucun mĂ©canisme pour importer, inclure ou appeler des bibliothĂšques supplĂ©mentaires. Tout le code requis doit ĂȘtre incorporĂ© dans lâUDF.
De plus, la fonction eval()
JavaScript intégrée est désactivée.
Taille et profondeur de la variante retournée¶
Les objets de variantes renvoyĂ©s sont soumis Ă des limitations de taille et de profondeur dâimbrication :
- Taille:
Actuellement limité à plusieurs mégaoctets, mais sujet à changement.
- Profondeur:
Actuellement limitĂ© Ă une profondeur dâimbrication de 1 000, mais sujet Ă changement.
Si un objet est trop grand ou trop profond, une erreur est retournĂ©e lorsque lâUDF est appelĂ©.
Les contraintes de type dâargument et de renvoi sont parfois ignorĂ©es¶
Certaines caractĂ©ristiques de type dĂ©clarĂ©es pour un argument ou une valeur de retour seront ignorĂ©es lors de lâappel de lâUDF. Dans ces cas, la valeur reçue peut ĂȘtre utilisĂ©e telle quelle, quâelle soit ou non conforme aux contraintes spĂ©cifiĂ©es dans la dĂ©claration.
Les éléments suivants sont ignorés pour les UDFs dont la logique est écrite en JavaScript :
Longueur des arguments de type VARCHAR
Exemple¶
Le code de lâexemple suivant dĂ©clare que lâargument arg1
et la valeur de retour doivent ĂȘtre un VARCHAR dâune longueur maximale dâun caractĂšre. Cependant, lâappel Ă cette fonction avec un arg1
dont la valeur est supĂ©rieure Ă un caractĂšre aboutira comme si la contrainte nâĂ©tait pas spĂ©cifiĂ©e.
CREATE OR REPLACE FUNCTION tf (arg1 VARCHAR(1))
RETURNS VARCHAR(1)
LANGUAGE JAVASCRIPT AS 'return A.substr(3, 3);';