Known Issues for SPLASH

Learn about known issues and apply workarounds for SPLASH.

SPLASH issues
CR# Description
662913

You can globally define dictionary and vector data structures; however, limit global use to reading them. Only one stream should write to a dictionary or vector data structure; while that stream is writing, no other stream should write to or read from that data structure. The underlying objects used to manage the global dictionary or vector data structures are not thread-safe. A stream must have exclusive access to the global dictionary or vector data structure while writing. Allowing other streams to access these data structures while one stream is writing may result in server failure.

Additionally, limit the use of these data structures to relatively static data (such as country codes) that are read by multiple streams, but that will not need to be updated during processing. Writing the data to the dictionary or vector must be completed before any streams read it.

All operations that read a global dictionary or vector should perform an isnull check, as shown here:
>typeof(streamname) rec := dict[symbol];
if( not (isnull(rec)) {
// use rec
}
693571
SPLASH lets you define “record event” variables such as:
 [ integer key1; | integer d1; string t1; ] var1; 
While you can conveniently reference the individual columns in “var1” using dot notation, you can only do this after the record event variable has been initialized. Once the record event has been initialized, you can access columns directly using dot notation (for example, count := var1.d1; or var1.t1 := 'Tuesday';). If you try to set column values using dot notation before initializing the record event with the bracket notation, the compiler will not flag an error, but the record will not yet exist and the assignment will fail.
717875

Defining a collection object inside a while loop and assigning it dynamically using the new call can cause the server to crash. To prevent this, define the collection object outside of the while loop. For example, instead of defining the vector "save" inside the while loop

...
while (a < 5) {
vector(int64) save := rmWaitMap[SourceStream1.NewColumn2];
if (isnull(save)) {
save := new vector(int64);
}
...
}
...

define it outside of the while loop

...
vector(int64) save;
while (a < 5) {
save := rmWaitMap[SourceStream1.NewColumn2];
if (isnull(save)) {
save := new vector(int64);
}
...
}
...