MUMPS Previous Release Information

Changes from version 1.37 to 1.39 are:

Make O 1:("/dev/lpt0":"W"):2 actually timeout. (V1.38)

Tidy up the output from $&DEBUG("LTD")

Add a little more info to the MUMPS_CRASH file.

Increase the string stack to a max of 1 MB (from .25 M)

Add diskerrors in DB_STAT and ^$SYSTEM("VOL",n,"diskerrors")

Remove panic("parse_merge() source_ptr wrong!!") in parse.c replace with SYNTX

Make $&%HOST(address,"NAME") work for a non-null address

In database Kill, ensure we have lots of free garbage queue entries.

Note: Version 1.38 was not released.

Changes from version 1.36 to 1.37 are:

Minor changes only. 

Add $&X(str,1) for four byte crc. 

Add version to MUMPS_CRASH file. 

Fix $J(-.02,0,2) removing the minus.

Changes from version 1.35 to 1.36 are:

This version is a maintenance version with some tidy up included to start
the port to Apple Mac OS X - the following changed:

Make it so $J(-.0001,0,2) does not return a leading minus.

Remove #include  from a few source files.

Wait longer in ForkIt so we don't get a panic with:
        ForkIt: Child job never got setup

Make $&%DIRECTORY() work with a supplied directory spec.

Ensure $FN(n,"P",2) has a leading zero where -1 < n < 1.

Change $STORAGE to return 1024 instead of 42.

Tidy up the runtime functions code.

Changes from version 1.34 to 1.35 are:

This release provides a fix to two problems introduced with decimal

WRITE 0-0 should return 0 not -0.

A loop of the form FOR A=12345:.0001 fails to increment - now fixed.

Changes from version 1.33 to 1.34 are:

An external call $&%COMPRESS() has been added as follows:

Form:   $&%COMPRESS(global,level) ;A level of 99 means "the lowest level"
Retn:   The level done or negative MUMPS error number
Eg:     W $&%COMPRESS("^UTILITY",99) ;Compress the data level of UTILITY

Note:   This call updates $REFERENCE as it goes.

A utility COMPRESS has been added to simplify using $&%COMPRESS.

Because of problems like:       W 34711703.91+13711.55
                  giving:       34725415.45999999

we have removed all floating point maths and replaced it with
the decimal maths from FreeMUMPS.

Add ^$SYSTEM("PRECISION") for decimal precision (defaults to 12).
Add ^$JOB(job,"PRECISION") for decimal precision (default to ^$S("PRECISION")).
Both may be set with priv in the range 0 to 31.

The change to decimal arithmetic has improved the speed of FOR loops

WARNING: Although both the new arithmetic and the compress code have been
         tested, there are possibly still bugs there.

Changes from version 1.32 to 1.33 are:

The database "out of space" check caused an endless loop on a nearly full
database - this has been fixed.

The construct LOCK (^FRED(1,2,3),^FRED(2)) was corrupting locktab causing
following lock operations to result in a core dump - now fixed.

In some cases (fairly low probability), a KILL would fail to re-key
pointer blocks correctly.  This is now fixed.

Under certain circumstances, involving a number of arithmetic operands,
one of which commenced with spaces, the spaces would be erroneously
ignored and a non zero value returned.  This now correctly returns zero.

A potential problem existed with a KILL ^$LOCK(ref) as it didn't obtain
a semaphore before calling the lock code - now fixed.

The LOCK ref:0 construct, actually waited one second before returning.
This now returns immediately as it should.

When setting in a backward direction, ensure reasonable packing density.
This was returning packing densitites of about 2% - this now packs
correctly but takes three to four times as long as populating a global
in the forward direction.

In the last version, SYSTAB base was moved from 16MB to 1GB to allow for
larger buffer sizes.  On linux, this has been moved back to 16MB so it
will compile.

With this release the distribution files have been renamed to:

FreeBSD:        mumpsVVVfreebsd.tgz
linux:          mumpsVVVlinux.tgz

We have discontinued support for FreeBSD version 3.2 and have given up
on the idea of ever porting MUMPS to the alpha architecture.

Changes from version 1.31 to 1.32 are:

Fix bug where setting volume name to full eight characters cleared
database version number.

Attempt to trap "Resource temporarily unavailable" errors in read from pipe.

Fix READ *A:0 to set $TEST correctly

Move SYSTAB base from 16MB to 1GB to allow for larger buffer sizes.

Changes from version 1.30 to 1.31 are:

Minor changes to FIX to display more information and to re-write
a Global Directory type correctly.

Minor changes copying flags and type in a Global Directory copy.

Changes from version 1.29 to 1.30 are:

This version has been released as we believe we have finally found the
database problem that has been bugging us for months - ie. The creation
of an empty pointer block on a data block split.

The database should now be free of bugs.

For the first time, we now offer MUMPS for FreeBSD V3 and V4.

Changes from version 1.28 to 1.29 are:

This version has been released to fix a few small but anoying bugs.

Change to $&%HOST() to display ip address elements greater than
127 correctly.

Attempt to fix database problem when a change to the top node of a
global causes a key split.

Changes from version 1.27 to 1.28 are:

This version has been released to fix a few small but anoying bugs.

Make $&%OPCOM to a device timeout after two seconds.

Fix error in $JUSTIFY() and $FNUMBER() introduced in V1.27

Put the leading zero back on $FNUMBER() - broken in V1.27

Changes from version 1.26 to 1.27 are:

Bugs fixed in this release.

In UTIL_Key_Extract stop SEGV for impossible string lengths.

In ftocstring ensure we can't return -0 (just for linux).

Rewrite three argument form of $JUSTIFY to not use floating point.

Change $FNUMBER to not use floating point.

Increase panic time in Get_GDBs from 9 to 30 seconds.

In %GS, always save the top node of a global.

Fix re-key code re optimise pointer block usage to remove old pointers.
(Bug introduced in Ver 1.26.)

NOTES:  It appears that the RedHat build doesn't work on Mandrake.

Changes from version 1.25 to 1.26 are:

This version has been released to fix two small but anoying bugs.
Hopefully, the changes to the symbol table code will now allow
Fileman to run correctly.

The changes are:

Change to re-key code to optimise pointer block usage and stop a low
possibility of leaving an empty pointer block (from a pre V1.13 database).

Fix some minor bugs in the symbol table code.

Changes from version 1.24 to 1.25 are:

This version includes a change to the compiler and
hence a change in the compiler version.  All routines will have
to be recompiled - to do this, after copying the mumps executable
to a suitable place in your path, start the mumps environment,
get into mumps and at the M> prompt enter:

        M> O 1:("utils":"r") U 1 R X X X
then    M> D ^%RECOMP
and in every UCI in use, D ^%RECOMP

We have attempted to validate (again) this version using the MUMPS
Validation Suite.  The results were mixed; some bug fixes; some additions
to the bugs list and some confusion.  There is just too much work in
setting up and running the validation suite for us to persist with it
for the time being.

If you are interested in running the MUMPS Validation Suite, the following
will be of use:

1. Create a database with a minimum block size of 10kb (16kb recommended).
2. Each time the environment is started: SET ^$S("EOK")=1,^$S("OFFOK")=1
   and VV4.RTN.
4. DO ^VV1

See the current bug list at for a
list of the bugs found and not yet fixed.

This version was also tested by attempting to load Fileman V22.  It now
goes a lot further than it did but still falls over with an undefined
local variable at +65^DDSZ2 - I'll leave that to the Fileman experts to
get back to me.

The changes in this version are:

Make the sequence K ^FRED S ^FRED(1)=1 K ^FRED(1) W $D(^FRED)
return 0 as it should.  Make the sequence K ^FRED S ^FRED(1)=1 W $D(^FRED)
return 10 as it should.

Routine of the form:
         W "Line 1",! D
         W "Line 2",! D
         .W "Line 3",!
Resulted in:
Line 1
Line 2
Line 3
Line 2
Line 3
Now fixed (although I think it should give an error).

Allow for the construct K (X,Y,Z),(X,W).

Allow for the construct NEW (A,B),C.

Allow for indirection in NEW - eg. N (@C,@A,@B)

Allow for DO rouref(.@var) and $$rouref(.@var)

        GLOBAL           Global environment (uci#)
        GLOBAL_VOL       Global environment (volset#)
        LOCK             Lock environemnt (uci#)
        LOCK_VOL         Lock environemnt (volset#)
        ROUTINE          Routine environment (uci#)
        ROUTINE_VOL      Routine environment (volset#)
now requires PRIV or %routine as well as being current job.

A SET ^$JOB(job,"PRIV")=0 will drop any super user privs as
long as ^$JOB(job,"OWNER_ID") is a valid (non-zero) uid.

Make READ @var and READ *@var work correctly.

Remove integer only FOR loop code to allow for the case when the
index variable is set to a non-integer within the loop.
This results in a slower execution of FOR loops for now.

Changes from version 1.23 to 1.24 are:

This version includes a change to the compiler and
hence a change in the compiler version.  All routines will have
to be recompiled - to do this, after copying the mumps executable
to a suitable place in your path, start the mumps environment,
get into mumps and at the M> prompt enter:

        M> O 1:("utils":"r") U 1 R X X X
then    M> D ^%RECOMP
and in every UCI in use, D ^%RECOMP

The changes in this version are:

S Z="ERROR^%M" W $T(@Z) was giving a Z12 error, now fixed and
hopefully all types of $TEXT() now work correctly.

Allow WRITE ?-n to be ignored instead of giving an error.

Fix bug in compiler where the sixty-fifth variable was sometimes
treated as an indirect reference.

Changes from version 1.22 to 1.23 are:

Fix $TEXT(tag) returning error.

Fix NEW @var causing segmentation fault.

NEW variables in reverse order to restore to stop NEW A,A losing variables.

W "A"?1(1"Y",1"") caused an endless loop - now it doesn't but it gives the
wrong result.

Changes from version 1.21 to 1.22 are:

Integrity checker - remove extra messages when accessed block is free.

Add $NEXT() and ^$SYSTEM("$NEXTOK") enabling switch.

w $J(-.0004,0,2) was returning -0.00 - now fixed (same with $FN()).

S X="%1C" W $T(^@X)]"" was returning "Z12" - now fixed.

The historic (read usless) functionallity enabling switches have
now been moved into one word and hence, now, return their bit values.
^$SYSTEM("EOK")         -> 1               // E syntax flag
^$SYSTEM("OFFOK")       -> 2               // GO/DO with offset OK
^$SYSTEM("$NEXTOK")     -> 4               // $NEXT OK
This is to allow for future developments (watch this space).

There was a timing window when two pointer blocks were being combined
which caused the garbage collector to free blocks pointed at by the
second block - this has been fixed.

Changes from version 1.20 to 1.21 are:

Yet more changes to fix +"1EA"/"1EA" -> M9, Divide by zero

Make D work in FIX, make %BLKDMP save data correctly.

Don't allow a pointer block to become empty.

Fix uci creation code in both places (MGR was worse)

Changes from version 1.19 to 1.20 are:

This is the first release version compiled with an optimize switch to C.

Add Dump and List with search string to FIX.
Modify Colin's %X364 so it fits in 4KB.

W -177#11 was returning -1 should be 10, now fixed.

Don't allow $X and $Y to go negative.

Changes from version 1.18 to 1.19 are:

Fix bug where n*"Exxx" evaluated to n.

Ensure low 3 bits in maximum block number are set (ie: volsiz#8 = 7)

Check for a full database - must be 8 blks available for set

Fix %WWWU so import doesn't add a blank line to the end of a text file.
Fix %WWW and %WWW1 - minor problems in error logging
Add %X364 ;Namespace - ANSI X3.64-1979 - Kindly donated by Colin Richardson
Fix JOURNLST calling incorrect date/time routine

Add SET ^$SYSTEM("VOL",n,"NAME")="new name"
    SET ^$SYSTEM("VOL",n,"SIZE")=new vol set size (to expand it)
    SET ^$SYSTEM("VOL",n,"JOURNAL_SIZE")=0 (to clear the journal)
    WRITE ^$SYSTEM("VOL",n,"JOURNAL_SIZE") (current journal size - bytes)

    SET ^$GLOBAL("$GLOBAL","JOURNAL")=1 to default all NEW globals to jrnl

Add single user mode for changing sensitive parameters (see below).

Note that the documentation at has been (slightly)


Single User Mode

To start up MUMPS in single user mode,

$ mumps -j1 database
$ mumps database

Note: journaling is not enabled in this mode.

The things that can be done in single user mode that can't be done
in normal (timesharing) mode are:

1. SET ^$SYSTEM("VOL",n,"NAME")="new name"
2. SET ^$SYSTEM("VOL",n,"JOURNAL_FILE")="new file path/name"
3. SET ^$SYSTEM("VOL",n,"SIZE")=new vol set size (to expand it)
   Note: absolute maximum size is map size in bytes x 8 - 1 blocks.
   W ^$S("VOL",1,"HEADER")-1024*8-1

Only user who started environment or root, may log in in this mode.

For backup with journal control I suggest:

/usr/local/bin/mumps -x 'S ^$S("VOL",1,"WRITELOCK")=1' /one/onedb
sleep 5
mt rew
dump -0uaf /dev/nrsa0 /
sleep 10
mt fsf
dump -0uaf /dev/nrsa0 /usr
sleep 30
/usr/local/bin/mumps -x 'S ^$S("VOL",1,"JOURNAL_SIZE")=0' /one/onedb
/usr/local/bin/mumps -x 'S ^$S("VOL",1,"WRITELOCK")=0' /one/onedb
mt offline

Changes from version 1.17 to 1.18 are:

This release involves a change to the database layout and
therefore a change in the database version.


I suggest: gzip -c database > database.gz

To upgrade the database version (after copying the mumps executable
to a suitable place in your path) start the mumps environment.
This will ATTEMPT to upgrade the database - IT COULD FAIL.
The upgrade involves changing the layout of the global directory
to add a "flags" word for journaling.

This release also involves a change to the compiler/interpreter and
hence a change in the compiler version.  All routines will have
to be recompiled - to do this, after copying the mumps executable
to a suitable place in your path, start the mumps environment,
get into mumps and at the M> prompt enter:

        M> O 1:("utils":"r") U 1 R X X X
then    M> D ^%RECOMP
and in every UCI in use, D ^%RECOMP

The changes in this version are:

Make TCP open work correctly on linux.  The results in an error occuring
when a non-existant address is assessed after a specific time.  Both
the error and the time are O/S specific as follows:

                        linux           FreeBSD
Timeout (secs)              3                60
Errror                   Z313              Z260

Implement USE with namespace U ch:[(param)]:namespace and WRITE /arg[(params)]
(see below).

Fix bug in TYPE for TAG(params).
Add JOURNLST for listing journals.

Add ssvns ^$SYSTEM("VOL",vol,"journal_available") (Read only)

Add journaling (see below).

Journaling under MUMPS V1

To enable journaling, the following steps must be taken:

1. SET ^$SYSTEM("VOL",1,"JOURNAL_FILE")="full journal path/filename"
3. Restart the environment

Notes:  ALL users that are to access MUMPS must have read/write
        access to the file and the file initially must not exist.
        (it's OK to leave it there between restarts however.)

        If the file cannot be accessed for any reason, the environment
        will still start up giving a warning message.

        Check the availability of journaling with:

To journal a particular global, in the correct UCI:

1. Ensure the global is defined.
2. SET ^$GLOBAL("global","JOURNAL")=1
   (eg. SET ^$GLOBAL("FRED","JOURNAL")=1)

To disable journaling, just:
Journaling will be disabled and can't be enabled again without:

2. Restarting the environment

Each job that connects to a journaling environment opens the
journal file read/write.  If the open fails, an error message is
displayed and if the '-x command' switch was used or the connect
was from the JOB command, the connect will fail.

To list a journal file use the ^JOURNLST utility.
To understand the layout of the journal file, read the ^JOURNLST utility.
Note: The date/time used is GMT not local time.

Using Namespace with MUMPS V1

To associate a namespace with a device/file use either:

        USE ch:[(params)]:namespace
        OPEN ch:(param1:param2):namespace

where namespace is the name of a routine (eg: %VIDEO) that contains
tags for every required command.

When WRITE or READ /cmd(params) is used, this becomes:

        DO cmd^namespace(params)

We have not, at this stage provided any namespace routines.

Changes from version 1.16 to 1.17 are:

The x86 linux port is now built on RedHat 6.2.
I 1 R *A:0 W $T returned 1 - now fixed.
Improvements to the maths functions particularly for linux.
Ensure root always has PRIV set.
In the utilities, improve FIX, remove the web interface to MCL.
Database - Ensure an empty block gets garbaged.
Local symbol table - amend "replace data" code in dependents. This caused problems particularly in linux.

Changes from version 1.15 to 1.16 are:

This release involves a change to the compiler/interpreter and hence a change in the compiler version. All routines will have to be recompiled - to do this, after copying the mumps executable to a suitable place in your path, start the mumps environment, get into mumps and at the M> prompt enter:

either M> O 1:("utils":"r") U 1 R X X X
or M> M ^$R("%RECOMP")=^$R("%RECOMP")
then M> D ^%RECOMP
and in every UCI in use, D ^%RECOMP

The changes in this version are:
Fix end of variable subscript checking.
Change $CHARACTER to $CHAR as it should be.
Fix bug where numeric value can be stored without trailing null hence returning an incorrect value.
Fix floating point errors in integer divide and moduluo.
Fix indirection with routine references for DO, GOTO, JOB and $TEXT().
Add routine offset capability to routineref (with ^$SYSTEM("offok") switch).
Fix E notation to conform to the standard (with ^$SYSTEM("eok") switch).
Changes as above plus passing the first part of the standards test.
Notes: To allow the "optional" parts, the switch must be turned on during BOTH compilation and running those routines which need it - for example: S ^$SYSTEM("offok")=1,^$SYSTEM("eok")=1 D ^%RECOMP and ensure that both switches are set each time the system is started up.
Further work is planned for the remainder of the standard.

Changes from version 1.14 to 1.15 are:

Rewrite database re-keying functions to allow for some obscure conditions.
Add $&%SIGNAL(pid,sig) to send a signal. Returns 1 ->OK or 0 on fail. If pid<1 or sig<0 or sig>31 throws error M99 Invalid operation for contex.
Set "PRIV" correctly at start up.
Add "set data" capability to %BLKDMP.
Save terminal settings on entry and re-set on exit.

Changes from version 1.13 to 1.14 are:

Make $FN behave properly with negative numbers and comma delimiting.
Remove unused errors, ensure all O/S errors are > Z200.
Make $TEST value correct when no timeout specified for a lock.
Move sleep(1)'s in lock to only sleep if we haven't timed out.
Make function def following dotted line quit correctly.
Port to Linux (Red Hat 5.2).

Changes from version 1.12 to 1.13 are:

Allow $translate to be lower case.
Make W $E("ABC")]"A" and S A="" W A]"" return zero as they should.
Don't garbage descendants when combining pointer blocks.

Changes from version 1.11 to 1.12 are:

Improve check for invalid MUMPS special variables at compile time.
Make argumentless NEW work.
Use unsigned ints for system counters.
Make $&%OPCOM() to a device timeout after two seconds.
Allow $$A(.1) to work - ie. it's not a 'by reference'.
Allow DO A(.1) to work - ie. it's not a 'by reference'.
Allow extrinsic and DO() of the form S A=$$B(1,,4)
%RR ;Routine Restore from file - allow for spare $C(13) in the file (aka MSM)
%GR ;Global Restore from file - allow for spare $C(13) in the file, attempt to understand MSM %GS format.
Allow for the syntax NEW A,@B,C
Allow for the syntax READ !!,A
Add error ERRZ70 Offset not permitted in entryref.
Tidy up some obscure problems in complex kill.
Ignore all unknown signals.
Remove dsusp from so it doesn't generat an error.
Ensure any abnormally terminated job slots are clear at start and JOB.

Changes from version 1.10 to 1.11 are:

Allow for replacement of first node which forces a split
Fix incorrect code for inserting changed down pointer in the top common block.
When writing and get is from last used, set blk[level]->dirty to 1 for all occurences.
Increase maximun number of pattern atoms from 14 to 20.
Fix $FNUMBER() droping a leading zero.

Changes from version 1.09 to 1.10 are:

Fix the case where a kill causes a block split on a key insert in the top common block for all nodes removed.
Allow ^%WWW to accept http version 1.anything
Fix incorrect result from +"-.1"
When writing and get is from last used, ensure block is written.

Changes from version 1.08 to 1.09 are:

Add CONTROLT and NOCONTROLT. Make this and CONTROLC manipulate character usage rather than signals so R *A will work for 3 and 20.
Make LOCK understand TRANTAB.
Make trantab search more efficient.
Parse READ in full correctly.
Add optional Exponent syntax for numerics (yuk).
Make $Q() and $O() return correctly when global is undefined.
Change to integer divide so large (greater than int) numbers will work.
Change to parse_if() to detect indirection correctly. IF variable was compiling incorrectly where variable was index 65 in the routine.

Changes from version 1.07 to 1.08 are:

Add to return mini-status on last line of screen.
Fix bug to do with defaulting UCI and VOL in lock in the wrong place.
FIX bug in $ORDER() incorrectly doubling quotes in return value.
Fix problem with O ch:(port:"SERVER=n") and subsequent attaches.
Attempt to fix 'wrong top node in directory' error.
Minor fixes to FIX.
Add routines %DD and %DED and MCL commands DCHANGE, DDIRECT and DSCAN.
Add %WWW, %WWW1 and %WWWU, the web interface.
Minor changes to other routines for web interface.

Changes from version 1.06 to 1.07 are:

Fix problem with complex set and upper level pointers.
Minor additions to $&%IC().
Minor additions to FIX.

Changes from version 1.05 to 1.06 are:

Fix problem where KILL left orphan blocks.
Fix errors in reverse $ORDER() and $QUERY().
Ensure map size is a multiple of 1 kb.
Fix subtle problem with SET A=$$XYZ(args) where subroutine XYZ uses QUIT $GET(A,"text").
Add a version of FIX that actually does something.
Add %STAT - Display database statistics.

Changes from version 1.04 to 1.05 are:

For this version, the database module has been completely rewritten as the previous database implementation was too hard to debug. As part of the rewrite, global translation has been added.
Parse end of string correctly.
In utilities, add %TYP, modify FIX.
Stop F I (false) from overflowing string stack

Changes from version 1.03 to 1.04 are:

Give more information on block not allocated error.
Add creation of ~/MUMPS_CRASH for crash logs.
Add ERROR DISPLAY to utilities.
Don't leave an negative error number in asp.

Changes from version 1.02 to 1.03 are:

Ensure chanel is closed on tcp failure.
Stop releasing semaphores twice on LOCK timeout.
bzero entire jobtab in CleanJob.
Change panic() to SYNTX in parse_set().

Changes from version 1.01 to 1.02 are:

Protect the string stack for FORK and IC.
Make $GET(^$R("xx",n)) work correctly.
Make ?1(3U1".".E,1U1".".E) work correctly.
Ensure global directory written out after a K ^GLOB.

Changes from version 1.00 to 1.01 are:

Allow the last subscript in $NAME to be null.
Add $&%HOST("","NAME") to return the current host name.
Allow for stdin to be a server socket as from inetd.
Make $NA(^GLOB("")) return $NA(^GLOB("")) not $NA(^GLOB()).
Make SET ^(1)=^GLOB(2) work correctly (naked indicator).
Fix format of panic() messages.
Add routine %RECOMP.

Up to Version 1.00 we were just coding it...