Index: trunk/Ohana/src/opihi/dvo/dbFields.c
===================================================================
--- trunk/Ohana/src/opihi/dvo/dbFields.c	(revision 13479)
+++ trunk/Ohana/src/opihi/dvo/dbFields.c	(revision 14191)
@@ -1,5 +1,22 @@
 # include "dvoshell.h"
 
-dbInitField (dbField *field) {
+void dbFreeFields (dbField *fields, int Nfields) {
+
+  int i;
+
+  if (fields == NULL) return;
+
+  for (i = 0; i <= Nfields; i++) {
+    if (fields[i].name != NULL) free (fields[i].name);
+    if (fields[i].photcode != NULL) {
+      if (fields[i].photcode[0].type == PHOT_MAG) {
+	free (fields[i].photcode);
+      }
+    }
+  }
+  free (fields);
+}
+
+void dbInitField (dbField *field) {
   field->name = NULL;
   field->extract = FALSE;
@@ -26,12 +43,15 @@
 PhotCode *ParsePhotcodeField (char *field, int *mode, int defMode) {
 
+  int useDefault;
   char *tmpstring, *p;
   PhotCode *code;
 
   *mode = defMode;
+  useDefault = TRUE;
 
   p = strchr (field, ':');
   if (p != NULL) {
     *mode = GetMagMode (p + 1);
+    useDefault = FALSE;
     if (*mode == MAG_NONE) return (NULL);
     tmpstring = strncreate (field, p - field);
@@ -39,7 +59,30 @@
     tmpstring = strcreate (field);
   }
+  if (!strcasecmp (tmpstring, "MAG")) {
+    ALLOCATE (code, PhotCode, 1);
+    code[0].code = 0;
+    strcpy (code[0].name, "MAG");
+    code[0].type = PHOT_MAG;
+    free (tmpstring);
+    return (code);
+  }
   code = GetPhotcodebyName (tmpstring);
+
+  // enforce compatibility
+  // XXX this is kind of poorly done
+  if ((code[0].type == PHOT_REF) && (*mode != MAG_ERR)) {
+    *mode = MAG_CAT;
+  }
+  if (code[0].type == PHOT_DEP) {
+    if (useDefault) {
+      *mode = MAG_REL;
+    } else {
+      if ((*mode == MAG_AVE) || (*mode == MAG_REF)) {
+	// XXX error;
+	*mode = MAG_REL;
+      }
+    }
+  } 
   free (tmpstring);
-
   return (code);
 }
@@ -112,6 +155,6 @@
   if (!strcasecmp (fieldName, "PAR"))   ESCAPE (AVE_PAR,       MAG_NONE);
   if (!strcasecmp (fieldName, "dPAR"))  ESCAPE (AVE_PAR_ERR,   MAG_NONE);
-  if (!strcasecmp (fieldName, "MAG"))   ESCAPE (AVE_MAG,       MAG_AVE);
-  if (!strcasecmp (fieldName, "dMAG"))  ESCAPE (AVE_dMAG,      MAG_ERR);
+  // if (!strcasecmp (fieldName, "MAG"))   ESCAPE (AVE_MAG,       MAG_AVE);
+  // if (!strcasecmp (fieldName, "dMAG"))  ESCAPE (AVE_dMAG,      MAG_ERR);
   if (!strcasecmp (fieldName, "NMEAS")) ESCAPE (AVE_NMEAS,     MAG_NONE);
   if (!strcasecmp (fieldName, "NMISS")) ESCAPE (AVE_NMISS,     MAG_NONE);
@@ -129,4 +172,9 @@
   code = ParsePhotcodeField (fieldName, &mode, MAG_AVE);
   if (code == NULL) return (FALSE);
+  if (code[0].type == PHOT_MAG) {
+    gprint (GP_ERR, "'mag' is ambiguous for avextract\n");
+    free (code);
+    return (FALSE);
+  }
 
   // need to distinguish phot, sys errors and scatter
