{
  "str_concat":" CONCAT ",
  "$ifnull":{ "params": ["a","b"], "sql": "ifnull(%%%a%%%,%%%b%%%)" },
  "$addDays":{ "params": ["date","cnt"], "sql": "(%%%date%%% + %%%cnt%%% days)" },
  "$addHours":{ "params": ["date","cnt"], "sql": "(%%%date%%% + %%%cnt%%% hours)" },
  "$addMinutes":{ "params": ["date","cnt"], "sql": "(%%%date%%% + %%%cnt%%% minutes)" },
  "$toDate":{ "params": ["date"], "sql": "cast(%%%date%%% as date)" },
  "$topn": { "params": ["CNT","..."], "sql": "%%%...%%% limit %%%CNT%%%" },
  "$getInsertCount": {
    "params": [],
    "exec": "return 'SELECT COUNT(*) \"xrowcount\" FROM FINAL TABLE ('+[].slice.call(arguments).join(',')+')';"
  },
  "$getUpdateCount": {
    "params": [],
    "exec": "return [].slice.call(arguments).join(',')+';return_row_count()';"
  },
  "$errorif": {
    "params": ["COND","MSG"],
    "exec": [
      "var errmsg_var = 'jsherrmsg'+Math.round(Math.random()*10000).toString();  while(errmsg_var in this.vars) errmsg_var += '_'; this.vars[errmsg_var] = true;",
      "var rslt = 'begin declare '+errmsg_var+' varchar(2048)\\\\; ';",
      "rslt += 'if ('+COND.trim()+') then \\n';",
      "MSG = MSG.trim();",
      "if(MSG && (MSG[0]=='\\'')) MSG = '\\'Application Error - '+MSG.substr(1);",
      "rslt += 'set '+errmsg_var+'='+MSG+'\\\\;\\n';",
      "rslt += '  SIGNAL SQLSTATE VALUE \\'JHERR\\' SET MESSAGE_TEXT = '+errmsg_var+'\\\\; \\n';",
      "rslt += 'end if\\\\; ';",
      "rslt += 'END';",
      "return rslt;"
    ]
  },
  "$ceiling": { "params": ["VAL"], "sql": "ceil(%%%VAL%%%)" },
  "$floor": { "params": ["VAL"], "sql": "floor(%%%VAL%%%)" },
  "$greatest": {
    "params": [],
    "exec": "return 'greatest('+[].slice.call(arguments).join(',')+')';"
  },
  "$lpad": {
    "params": ["STR","LEN","PADCHAR"],
    "sql": [
      "LPAD(%%%STR%%%, %%%LEN%%%, %%%PADCHAR%%%)"
    ],
  },
  "{{concat}}":{
    "params": [],
    "exec": [
      "if(arguments.length<1) return 'null';",
      "var rslt = '(' + arguments[0];",
      "for(var i=1;i<arguments.length;i++){",
      "  rslt += ' CONCAT ' + arguments[i];",
      "}",
      "rslt += ')';",
      "return rslt;"
    ]
  },
  "{schema}.my_now":{
    "params": [],
    "sql": "(current timestamp)"
  },
}